2016-04-19 9 views
0

Ich habe eine CSV, die in folgendem Format ist:VBA - Split CSV-Datei in mehrdimensionales Array

[TestHeader] FIELDS, "Sprache", "LC_NUMERIC", "Zellennamen", "Testtype", REPORTER " TITLE, STARTDATE, STARTTIME, ENDDATE, DATENDYPE, Text (80), Text (80), Text (64), Text (80) , "Text (80)", "Text (80)", "Text (12)", "Text (20)", "Text (12)", "Text (20)"

Ich möchte Legen Sie diese Daten in ein mehrdimensionales Array, das als ob es in einem Blatt war. Wo die Zellen leer sind, wäre es auch in dem Array leer.

Ich versuche, das folgende zu verwenden, aber es legt nur die Daten in ein 1D-Array, das für das, was ich brauche, nicht geeignet ist.

Dim Delimiter As String 
Dim TextFile As Integer 
Dim FilePath As String 
Dim FileContent As String 
Dim LineArray() As String 
Dim DataArray() As String 

'Inputs 
    Delimiter = "," 
    FilePath = emiFilePath 

'Open the text file in a Read State 
    TextFile = FreeFile 
    Open FilePath For Input As TextFile 

'Store file content inside a variable 
    FileContent = Input(LOF(TextFile), TextFile) 

'Close Text File 
    Close TextFile 

'Separate Out lines of data 
    LineArray() = Split(FileContent, Delimiter, -1, vbTextCompare) 

'Read Data into an Array Variable 
     'Re-Adjust Array boundaries 
     ReDim Preserve DataArray(UBound(LineArray)) 
' 
     'Load line of data into Array variable 
     For y = LBound(LineArray) To UBound(LineArray) 
      DataArray(y) = Replace(LineArray(y), Chr(34), vbNullString) 
     Next y 
+0

einen bestimmten Grund Arrays zu benutzen? Haben Sie "ADO" zum Lesen von CSVs in Betracht gezogen? –

+0

Was ist ein ADO? Ich benutze Arrays, weil ich sie sehr gut kenne. – peetman

+1

@PankajJaju bezieht sich auf eine Methode zum Lesen von CSV-Dateien. Es gibt mehr als ein Dutzend Beiträge auf dieser Seite, die zeigen, worauf er sich bezieht. Suchen Sie einfach nach ihnen: http://stackoverflow.com/search?q=excel+vba+ado+csv Wenn Sie jedoch bei Ihrer Lösung bleiben möchten (was ich unterstützen würde), würde ich nicht die gesamte Datei lesen in eine Zeichenfolge, sondern Zeile für Zeile wie hier gezeigt (akzeptierte Lösung): http://stackoverflow.com/questions/11185191/opening-csv-file-via-ado-connection-column-limitation-to-255 -oder- Just-Use-Ano – Ralph

Antwort

0

Wenn Sie den Code ein:

'Separate Out lines of data 
    LineArray() = Split(FileContent, Delimiter, -1, vbTextCompare) 

Sie sind nicht Zeilen, sondern Felder getrennt durch Trennzeichen ""

Trennung Wenn Ihr cvs im Windows-Stil Zeilenende verwenden, zuerst Ihre Daten geteilt auf vbCrLf.

Function mySplit(ByVal emiFilePath As String) As Variant() 
    Dim Delimiter As String 
    Dim TextFile As Integer 
    Dim FilePath As String 
    Dim FileContent As String 
    Dim LineArray() As String 
    Dim DataArray() As Variant 
    'Inputs 
    Delimiter = "," 
    FilePath = emiFilePath 

    'Open the text file in a Read State 
    TextFile = FreeFile 
    Open FilePath For Input As TextFile 

    'Store file content inside a variable 
    FileContent = Input(LOF(TextFile), TextFile) 

    'Close Text File 
    Close TextFile 

    'Separate Out lines of data 
    LineArray = Split(FileContent, vbCrLf, -1, vbTextCompare) 
    ReDim DataArray(LBound(LineArray) To UBound(LineArray)) 
    Dim i As Long 
    'Separate fields inside the lines 
    For i = LBound(LineArray) To UBound(LineArray) 
     DataArray(i) = Split(LineArray(i), Delimiter, -1, vbTextCompare) 
    Next i 
    mySplit = DataArray 
End Function 
+0

Beachten Sie, dass meine Funktion ein Array von Arrays zurückgibt, kein 2D-Array. –

+0

Ich glaube nicht, dass Zeilen in meiner .csv-Datei vorhanden sind. Ihr Vorschlag gibt ein LineArray von 1 Zeile zurück. – peetman

+0

Dann haben Sie keine [CSV-Datei] (https://en.wikipedia.org/wiki/Comma-separated_values) und Sie müssen herausfinden, wie Datensätze in Ihrer "Textdatei" getrennt sind. – Ralph

0

Mit Hilfe von @Ralph und @VincentG

Dim Delimiter As String 
Dim TextFile As Integer 
Dim FilePath As String 
Dim FileContent As String 
Dim LineArray() As String 
Dim DataArray() As Variant 

'Inputs 
    Delimiter = "," 
    FilePath = emiFilePath 

'Open the text file in a Read State 
    TextFile = FreeFile 
    Open FilePath For Input As TextFile 

'Store file content inside a variable 
    FileContent = Input(LOF(TextFile), TextFile) 

'Close Text File 
    Close TextFile 

'Separate Out lines of data 
    LineArray() = Split(FileContent, vbLf, -1, vbTextCompare) 

'Read Data into an Array Variable 
     'Re-Adjust Array boundaries 
     ReDim Preserve DataArray(UBound(LineArray)) 
' 
     'Load line of data into Array, separate by commas and remove unwanted blank strings 
     For y = LBound(LineArray) To UBound(LineArray) 
      DataArray(y) = Split(Replace(LineArray(y), Chr(34), vbNullString), Delimiter) 
     Next y