Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

CSV Dateien durchsuchen und Werte extrahieren

Forumthread: CSV Dateien durchsuchen und Werte extrahieren

CSV Dateien durchsuchen und Werte extrahieren
Torsten
Hallo zusammen,
ich hab nen super Sonderwusch... ;-)
Ich möchte gerne eine Ordnerstruktur durchsuchen, die an bestimmten Stellen CSV-Dateien enthält und aus diesen, in einer Spalte, den höchsten Wert finden. Dieser soll dann zusammen mit dem Wert der in der gleichen Zeile, aber eine Spalte weiter steht, in eine neue Exceltabelle geschrieben werden. Erschwert wird das ganze noch, da zu den Werte noch der Name fehlt. Dieser steht nur als Ordnername zur verfügung.
Die Ordnerstruktur sieht wie folgt aus:
D:\Daten\100226\999999-001-LCMS-ROH.D\Analysis.csv
(100226 = Datum; 999999-001 = Name)
Das Script müsste also nach dem zu durchsuchendem Ordner unter D:\Daten fragen (also welches Datum) und die Extrahierten Werte aus der CSV-Datei mit den ersten zehn Stellen des Ordnernamens, über der CSV-Datei, kombinieren.
Die CSV ist wie folgt aufgebaut: (Komma getrennt)
#, RT [min], Area, Area Frac. %, Max. MW
1, 1.0, 11.3321, 0.7,
2, 1.2, 7.1489, 0.4,
3, 1.6, 30.0803, 1.8,
4, 1.8, 20.6700, 1.2,
5, 2.2, 8.8774, 0.5,
6, 2.2, 13.8220, 0.8,
7, 2.6, 11.8489, 0.7,
8, 2.8, 13.4342, 0.8,
9, 3.1, 5.6406, 0.3,
10, 3.3, 10.5907, 0.6,
11, 3.5, 10.2234, 0.6,
12, 3.8, 5.1625, 0.3,
13, 3.9, 13.2446, 0.8,
14, 4.2, 7.9869, 0.5,
15, 4.4, 5.6218, 0.3,
16, 4.6, 6.7800, 0.4,
17, 5.0, 25.7402, 1.5,
18, 6.8, 21.8434, 1.3,
19, 7.1, 28.1166, 1.7,
20, 7.5, 19.9014, 1.2,
21, 7.7, 11.9164, 0.7,
22, 7.9, 20.9286, 1.3,
23, 7.9, 21.5836, 1.3,
24, 8.2, 27.8813, 1.7,
25, 8.3, 5.1414, 0.3,
26, 8.4, 5.5113, 0.3,
27, 8.5, 4.0094, 0.2,
28, 8.7, 12.2723, 0.7,
29, 8.9, 616.1431, 36.9, 3913.897
30, 9.1, 602.2250, 36.0, 3913.909
31, 9.4, 9.7369, 0.6,
32, 9.6, 10.3611, 0.6,
33, 9.8, 3.2295, 0.2,
34, 10.0, 3.5003, 0.2,
35, 10.1, 3.8462, 0.2,
36, 10.3, 34.1941, 2.0,
Hier sollte der Wert "36,9" aus der Spalte "Area Frac. %" gefunden werden und zusammen mit dem "Max. MW" "3913,897" ausgegeben werden.
Das Ergebniss sollte dann so aussehen:
A B C
1 Name Area Frac. % Max. MW
2 999999-001 36,9 3913,897
3
4
Unter D:\Daten\[Datum]\ können zwischen 1 und mehr als 100 Unterordner sein, die dann alle in einer neuen Tabelle gelistet werden sollen und z.B. unter dem Datumsordner gespeichert werden. Die CSV-Dateien haben immer den gleichen Namen.
Ist das Möglich? Ich würde mich über eure Hilfe sehr freuen!
Grüsse
Torsten
Anzeige
AW: CSV Dateien durchsuchen und Werte extrahieren
26.02.2010 14:10:29
Torsten
Ich habe das hier gefunden. Wäre schon mal ein Ansatz...
Aber warum funktioniert das Makro nicht? Ich bekomme immer ne Fehlermeldung:

Sub oder 

Function nicht definiert.

Sub Makro4()
'Pfad anpassen!
Const Pfad As String = "D:\Eigene Dateien\Dein Ordner"
Dim i As Integer
With Application.FileSearch
.LookIn = Pfad
.Filename = "*.csv"
.SearchSubFolders = True 'Unterordner mit einbeziehen
.Execute
For i = 1 To .FoundFiles.Count
Call Dein_Makro(.FoundFiles(i))
Next i
End With
End Sub

Anzeige
AW: CSV Dateien durchsuchen und Werte extrahieren
26.02.2010 14:39:26
CM
Hallo Torsten,
im Code wird ein weiteres Makro mit dem Namen "Dein_Makro" und dem Parameter ".FoundFiles(i)" aufgerufen: Call Dein_Makro(.FoundFiles(i))
Dieses muss natürlich existieren.
Gruß
Christian
AW: CSV Dateien durchsuchen und Werte extrahieren
26.02.2010 14:48:21
fcs
Hallo Torsten,
hier eine Steuerdatei mit der entsprechenden Funktionalität.
Das Verzeichnis und das Datum im Blatt Steuerung muss du anpassen.
Gruß
Franz
https://www.herber.de/bbs/user/68261.xls
Anzeige
AW: CSV Dateien durchsuchen und Werte extrahieren
01.03.2010 08:18:42
Torsten
Hallo Franz,
besser als ich gehoft hätte! Das scheint wunderbar zu funktionieren. Werde es noch ausgiebig test, aber ich denke so wirds gemacht...
An alle anderen ebenfall vielen vielen Dank für eure sicher nicht unerheblichen Mühen!
Grüsse
Torsten
AW: CSV Dateien durchsuchen und Werte extrahieren
26.02.2010 15:09:50
IngGi
Hallo Torsten,
ich hätte auch noch eine Variante anzubieten:
Sub Analysis()
Const FOR_READING = 1
Dim objFSO As Object
Dim objFolder As Object
Dim objSubFolder As Object
Dim objFile As Object
Dim arrZeile As Variant
Dim dblFrac As Double
Dim strMW As String
Dim objShell As Object
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.BrowseForFolder(0, "Bitte den Datumsordner auswählen", 64, "D:\Daten")
If objFolder Is Nothing Then
MsgBox "Keinen Ordner ausgewählt!" & vbCrLf & vbCrLf & "Vorgang wird abgebrochen."
Exit Sub
Else
Set objFolder = objFolder.Self
Set objFolder = objFSO.GetFolder(objFolder.Path)
End If
With Tabelle1
.Range("A1") = "Name"
.Range("B1") = "Area Frac. %"
.Range("C1") = "Max MW"
End With
For Each objSubFolder In objFolder.SubFolders
If objFSO.FileExists(objSubFolder.Path & "\Analysis.csv") Then
Set objFile = objFSO.OpenTextFile(objSubFolder.Path & "\Analysis.csv", FOR_READING)
objFile.SkipLine
Do Until objFile.AtEndOfStream
arrZeile = Split(objFile.ReadLine(), ",")
If CDbl(Replace(arrZeile(3), ".", ",")) > dblFrac Then
dblFrac = CDbl(Replace(arrZeile(3), ".", ","))
strMW = arrZeile(4)
End If
Loop
Tabelle1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = Left(objSubFolder.Name, 10)
Tabelle1.Cells(Rows.Count, 1).End(xlUp).Offset(0, 1) = dblFrac
Tabelle1.Cells(Rows.Count, 1).End(xlUp).Offset(0, 2) = CDbl(Replace(strMW, ".", ","))
dblFrac = 0
strMW = ""
Else
Tabelle1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = Left(objSubFolder.Name, 10)
Tabelle1.Cells(Rows.Count, 1).End(xlUp).Offset(0, 1) = "Datei nicht gefunden !!!"
End If
Next 'objSubFolder
End Sub
Gruß Ingolf
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

CSV Dateien durchsuchen und Werte extrahieren


Schritt-für-Schritt-Anleitung

Um CSV-Dateien in einem bestimmten Ordner und dessen Unterordnern zu durchsuchen und Werte zu extrahieren, kannst du ein VBA-Makro nutzen. Hier ist eine einfache Anleitung:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Füge ein neues Modul hinzu: Rechtsklick auf "VBAProject (DeineDatei.xlsm)" > Einfügen > Modul.

  3. Kopiere den folgenden Code in das Modul:

    Sub Analysis()
        Const FOR_READING = 1
        Dim objFSO As Object
        Dim objFolder As Object
        Dim objSubFolder As Object
        Dim objFile As Object
        Dim arrZeile As Variant
        Dim dblFrac As Double
        Dim strMW As String
        Dim objShell As Object
    
        Set objFSO = CreateObject("Scripting.FileSystemObject")
        Set objShell = CreateObject("Shell.Application")
        Set objFolder = objShell.BrowseForFolder(0, "Bitte den Datumsordner auswählen", 64, "D:\Daten")
    
        If objFolder Is Nothing Then
            MsgBox "Keinen Ordner ausgewählt!" & vbCrLf & vbCrLf & "Vorgang wird abgebrochen."
            Exit Sub
        Else
            Set objFolder = objFolder.Self
            Set objFolder = objFSO.GetFolder(objFolder.Path)
        End If
    
        With Tabelle1
            .Range("A1") = "Name"
            .Range("B1") = "Area Frac. %"
            .Range("C1") = "Max MW"
        End With
    
        For Each objSubFolder In objFolder.SubFolders
            If objFSO.FileExists(objSubFolder.Path & "\Analysis.csv") Then
                Set objFile = objFSO.OpenTextFile(objSubFolder.Path & "\Analysis.csv", FOR_READING)
                objFile.SkipLine
                Do Until objFile.AtEndOfStream
                    arrZeile = Split(objFile.ReadLine(), ",")
                    If CDbl(Replace(arrZeile(3), ".", ",")) > dblFrac Then
                        dblFrac = CDbl(Replace(arrZeile(3), ".", ","))
                        strMW = arrZeile(4)
                    End If
                Loop
                Tabelle1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = Left(objSubFolder.Name, 10)
                Tabelle1.Cells(Rows.Count, 1).End(xlUp).Offset(0, 1) = dblFrac
                Tabelle1.Cells(Rows.Count, 1).End(xlUp).Offset(0, 2) = CDbl(Replace(strMW, ".", ","))
                dblFrac = 0
                strMW = ""
            Else
                Tabelle1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = Left(objSubFolder.Name, 10)
                Tabelle1.Cells(Rows.Count, 1).End(xlUp).Offset(0, 1) = "Datei nicht gefunden !!!"
            End If
        Next 'objSubFolder
    End Sub
  4. Passe den Pfad an, falls dein Ordner anders ist.

  5. Führe das Makro aus: Drücke F5 oder wähle das Makro im Excel aus.


Häufige Fehler und Lösungen

  • Fehler: "Sub oder Function nicht definiert"

    • Dieser Fehler tritt auf, wenn das aufgerufene Makro (z.B. Dein_Makro) nicht existiert. Stelle sicher, dass alle aufgerufenen Funktionen im Code vorhanden sind.
  • Fehler: "Datei nicht gefunden !!!"

    • Überprüfe, ob die CSV-Datei im Unterordner tatsächlich existiert und ob der Dateiname korrekt ist.

Alternative Methoden

Wenn du keine VBA-Lösungen verwenden möchtest, kannst du auch Power Query in Excel nutzen, um CSV-Dateien zu importieren und zu transformieren. Dies ist besonders praktisch, wenn du eine grafische Benutzeroberfläche bevorzugst.

  1. Klicke auf "Daten" > "Daten abrufen" > "Aus Datei" > "Aus Ordner".
  2. Wähle den entsprechenden Ordner aus und importiere die Daten.
  3. Du kannst dann im Power Query Editor die gewünschten Daten filtern und transformieren.

Praktische Beispiele

Nehmen wir an, du hast mehrere CSV-Dateien mit den gleichen Spalten. Der oben genannte Code extrahiert den höchsten Wert aus der Spalte "Area Frac. %" und den dazugehörigen "Max. MW" für jede CSV-Datei. Das Ergebnis wird in Tabelle1 geschrieben, wobei der Name aus dem Ordnernamen stammt.


Tipps für Profis

  • Verwende Option Explicit am Anfang deines Moduls, um sicherzustellen, dass alle Variablen deklariert sind. Dies hilft, Fehler zu vermeiden.
  • Debugging: Nutze Debug.Print innerhalb deines Codes, um Werte während der Ausführung zu überprüfen.
  • Fehlerbehandlung: Implementiere On Error Resume Next und On Error GoTo für eine verbesserte Fehlerverfolgung.

FAQ: Häufige Fragen

1. Kann ich das Makro anpassen, um andere Spalten zu extrahieren?
Ja, du kannst die Indizes in der arrZeile-Variable anpassen, um andere Spalten auszulesen.

2. Funktioniert dieses Verfahren in Excel 2016?
Ja, das Makro sollte in Excel 2016 und neueren Versionen problemlos funktionieren. Achte darauf, dass die Makros in den Excel-Optionen aktiviert sind.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige