Daten aus CSV Datei in ein Array Übernehmen

  • Hallo,

    ich habe ein Problem beim Übertragen einer CSV in einem Array.

    CSV Datei:

    Spoiler anzeigen


    "Nachname","Vorname","Straße","Hausnummer","PLZ","Ort","Anzahl","Verbrauch","Musterartikel","Musterart"
    "Musterman","Fritz","Feierstr.",5,23333,"Hamelhausen",5,3050,"1","3"
    "Musterfrau","Victoria,Dr.","Abendrotstr.",7,23455,"Aschendorf",3,,"1","3"
    "Müller","Heinz,Dr.","Feldstr.",1,23455,"Aschendorf",,7700,"1","3"

    In Excel kann man die Daten importieren und wählt Trennzeichen >> , << und Texterkennungszeichen >> " << und alles ist gut...

    Wenn ich die Daten in Autoit in ein Array übertragen möchte, stolpere ich ein wenig.

    Bei:
    $Array = _StringBetween($CSVline,'"','"')
    bekomme ich falsche Spalten, da nur Spalten mit Textfeldern mit >> " << eingefaßt sind.

    Bei:
    $Array = StringSplit($SCVline,'"')
    bekomme werden teilweise mehr Spalten erzeugt, da ein Komma auch im Vornamen Feld vorhanden sein kann.


    Gibt es hier Eurer Meinung nach eine Lösung?

    Viele Grüße.

    Einmal editiert, zuletzt von rollod (1. August 2012 um 13:08)

  • Gibt es hier Eurer Meinung nach eine Lösung?

    Vermutlich kommen dann nur noch reguläre Ausdrücke in Frage. Da fehlt es mir selbst jedoch an Erfahrung...

    [autoit]


    stringregexp()

    [/autoit]

    Alternativ wäre noch folgendes Vorgehen denkbar:

    1. normaler stringsplit aufs Komma ohne Zusatzzeichen für jede Zeile, also --> StringSplit($SCVline,",")
    2. Prüfung des Stringsplit Ergebnisses der Zeile. Array durchlaufen und für jedes Feld prüfen, ob der String mit " anfängt. Wenn ja, dann muss er auch mit " aufhören. Ist das nicht so haben wie einen Splitfehler , den wir beim schreiben ins Zielarray durch zusammenfügen zweier Splitergebnisse korrigieren müssen.
    3. Sofern gewünscht vor dem Schreiben der Zeile ins Zielarray noch alle Anführungszeichen mit stringreplace ersetzen.

    7 Mal editiert, zuletzt von misterspeed (30. Juli 2012 um 23:51)

  • So in etwa?

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $sData, $aSS_1, $aSS_2, $aResult[1][2]

    [/autoit] [autoit][/autoit] [autoit]

    $sData = FileRead(@DesktopDir & "\test.csv")
    $sData = StringReplace($sData, '"', "")
    $sData = StringReplace($sData, @LF, "")

    [/autoit] [autoit][/autoit] [autoit]

    $aSS_1 = StringSplit($sData, @CR)
    $aSS_2 = StringSplit($aSS_1[1], ",")
    ReDim $aResult[$aSS_1[0]][$aSS_2[0]]

    [/autoit] [autoit][/autoit] [autoit]

    For $i1 = 0 To $aSS_1[0] - 1
    $aSS_2 = StringSplit($aSS_1[$i1 + 1], ",")
    For $i2 = 0 To $aSS_2[0] - 1
    $aResult[$i1][$i2] = $aSS_2[$i2 + 1]
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($aResult)

    [/autoit]
  • @m-obi,

    deine Version kann nicht klappen da auch in Feldern Kommas vorkommen führt dies zwangsläufig zu einem Array-Fehler wie mein (bisher) 1. Versuch:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $aCSV[1]
    Global $sCSVPath = @ScriptDir & "\Datei.CSV"

    [/autoit] [autoit][/autoit] [autoit]

    $aRet = _GetCSV($sCSVPath,$aCSV)
    _ArrayDisplay($aCSV)

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetCSV($sCSVPath,ByRef $aRet)
    Local $aTmp
    _FileReadToArray($sCSVPath,$aTmp)
    if Not IsArray($aTmp) Then
    SetError (1)
    Return -1
    EndIf
    Local $aSplit = StringSplit($aTmp[1],",")
    ReDim $aRet[$aTmp[0]+1][$aSplit[0]]
    for $i = 1 to $aTmp[0]
    _InsertRow($i,$aTmp[$i],$aRet)
    Next
    $aRet[0][0] = UBound($aRet)
    Return $aRet
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _InsertRow($i,$s,ByRef $a)
    Local $aSplit = StringSplit($s,",")
    for $j = 1 to $aSplit[0]
    $a[$i][$j-1] = StringReplace($aSplit[$j],'"','')
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    Edit: 2: Versuch

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $aCSV[1]
    Global $sCSVPath = @ScriptDir & "\Datei.CSV"

    [/autoit] [autoit][/autoit] [autoit]

    $aRet = _GetCSV($sCSVPath,$aCSV)
    _ArrayDisplay($aCSV)

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetCSV($sCSVPath,ByRef $aRet)
    Local $aTmp
    _FileReadToArray($sCSVPath,$aTmp)
    if Not IsArray($aTmp) Then
    SetError (1)
    Return -1
    EndIf
    Local $aSplit = StringSplit($aTmp[1],",") ; die Überschrifgtenzeile darf keine Kommas in Feldern haben
    ReDim $aRet[$aTmp[0]+1][$aSplit[0]]
    for $i = 1 to $aTmp[0]
    _InsertRow($i,$aTmp[$i],$aRet)
    Next
    $aRet[0][0] = UBound($aRet)
    Return $aRet
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _InsertRow($i,$s,ByRef $a)
    Local $aChar = StringSplit($s,"")
    Local $bInCell = False
    Local $iCell = 0
    for $j = 1 to $aChar[0]
    if $aChar[$j] = '"' Then
    $bInCell = Not $bInCell
    Else
    if Not $bInCell And $aChar[$j] = ',' Then
    $iCell += 1
    Else
    $a[$i][$iCell] &= $aChar[$j]
    EndIf
    EndIf
    Next
    EndFunc

    [/autoit]


    Bin einmal gespannt, ob es mit RegEx ohne grössere Umstände möglich ist. Würde mich dann überzeugen mich doch einmal damit zu beschäftigen, vor allem wenn es schneller als 5 Minuten gehen sollte das entsorechende Pattern zuentwickeln.

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (31. Juli 2012 um 06:54)

  • Hi,

    danke für die Antworten!

    @m-obi,

    autoBert hat leider recht. :S Wenn ich einwach nen StringSplit auf "," mache, werden in den Zeilen mit dem "Vorname,Dr" auch gesplittert...
    Dein Vorschlag sieht zwar irgendwie gut aus, aber ich bekomme in der For Schleife noch einen "dimension range exceeded", welches glaub ich auf mein dilemmer mit den ",Dr" hinweist... bin aber nicht ganz sicher... Habe Deine Vorgehensweise leider noch nicht ganz verstanden...:-(

    Viele Grüße

  • Man KANN das ganze auch ohne RegEx lösen, ist nur langwierig und nicht ganz einfach in der Umsetzung. Ich probiers mal aus, Rückmeldung kommt später.lg chess

    stimmt ich habe die Lösung bereits eingestellt. Allerdings ist die Laufzeit enorm langsam. Mein Benchmarktest:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $aCSV[1]
    Global $sCSVPath = @ScriptDir & "\Datei.CSV"
    $iStart = TimerInit()
    $aRet = _GetCSV($sCSVPath,$aCSV)
    $iEnd = TimerDiff($iStart)
    $aRet[0][1] = $iEnd & " ms"
    _ArrayDisplay($aCSV)
    ConsoleWrite($iEnd & " ms")

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetCSV($sCSVPath,ByRef $aRet)
    Local $aTmp
    _FileReadToArray($sCSVPath,$aTmp)
    if Not IsArray($aTmp) Then
    SetError (1)
    Return -1
    EndIf
    Local $aSplit = StringSplit($aTmp[1],",") ; die Überschriftenzeile darf keine Kommas in Feldern haben
    ReDim $aRet[$aTmp[0]+1][$aSplit[0]]
    for $i = 1 to $aTmp[0]
    _InsertRow($i,$aTmp[$i],$aRet)
    Next
    $aRet[0][0] = UBound($aRet) -1
    Return $aRet
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _InsertRow($i,$s,ByRef $a)
    Local $aChar = StringSplit($s,"")
    Local $bInCell = False
    Local $iCell = 0
    for $j = 1 to $aChar[0]
    if $aChar[$j] = '"' Then
    $bInCell = Not $bInCell
    Else
    if Not $bInCell And $aChar[$j] = ',' Then
    $iCell += 1
    Else
    $a[$i][$iCell] &= $aChar[$j]
    EndIf
    EndIf
    Next
    EndFunc

    [/autoit]

    mit 99999 Datensätzen läuft immer noch

    Edit: Fehler in Array[0][0] korrigiert Wert war um 1 zu hoch. Das Skript benötigt auf meinem uralt Laptop 209 Sekunden

    mfg autoBert

    2 Mal editiert, zuletzt von autoBert (31. Juli 2012 um 11:26)

  • Huh, hab ich garnicht gesehen... Naja, jetzt bin ich was am basteln, das mach ich auch fertig.
    An die Laufzeit hatte ich garnicht gedacht...

    lg chess

    Edit:
    Also vom Prinzip her funktioniert das...

    Source
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <String.au3>
    #include <Array.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Dim $asData, $asString
    _FileReadToArray("csv.txt", $asData)
    ;~ $asString = _StringBetween($asData[1],'"','"')
    Dim $asOutput[$asData[0] + 1]
    For $iLine = 1 To $asData[0]
    $asOutput[$iLine] = $asData[$iLine]
    $asString = _StringBetween($asData[$iLine], '"', '"')
    For $iStrings = 0 To UBound($asString) - 1
    $asOutput[$iLine] = StringReplace($asOutput[$iLine], '"' & $asString[$iStrings] & '"', "#REPLACE:" & $iStrings & ";")
    Next
    $asSplitted = StringSplit($asOutput[$iLine], ",")
    For $iIndex = 1 To $asSplitted[0]
    For $iStrings = 0 To UBound($asString) - 1
    $asSplitted[$iIndex] = StringReplace($asSplitted[$iIndex],"#REPLACE:" & $iStrings & ";",'"' & $asString[$iStrings] & '"')
    Next
    Next
    _ArrayDisplay($asSplitted)
    Next

    [/autoit]


    Die Geschwindigkeit ist natürlich eine andere Frage... Habe leider keine großen Tabellen zum testen (Bzw. das Skript hier hat ja nix mit Geschwindigkeit zutun)

    lg chess

  • Wenn man die Spalte Musterart sieht, sieht man das die letzten 2 Zeilen ein Komma zu viel drin haben.
    Oder ist das so gewollt, das dort eine Spalte Platz gelassen wird?

    Ach jetzt hab ich es mit dem komma was ihr meint. Hatte ich garnicht bemerkt.

    BTW: Wusste garnicht, dass ein Doktortitel mit zum Vornamen gehört.

    Wird eine CSV nicht mit einem ";" getrennt???

  • Wird eine CSV nicht mit einem ";" getrennt???

    üblicherweise ja, aber auch damit können Probleme vorkommen. Denn es gibt Fälle in denen ";" in Feldern vorkommen. Deshalb werden meist '"' verendet um Felder mit Texteingaben zu umschliessen.

    mfg autoBert

    • Offizieller Beitrag

    Ausgehend von dem Datensatz in Post#1 klappt das mit RegExp so:

    [autoit]


    #include <Array.au3>
    $sData = FileRead(@ScriptDir & '\data.csv') & ',' ; Datei einlesen und ein Komma anhängen für den letzten Datensatz
    $sData = StringReplace($sData, @CRLF, ',') ; alle Zeilenenden durch ein Komma ersetzen
    $aData = StringRegExp($sData, '(".+?"|.*?),', 3)
    _ArrayDisplay($aData)

    [/autoit]


    Dann erhält man ein Array mit 40 Elementen (0-39). Jeweils 10 Elemente ergeben dann eine Zeile.

  • Hallo UEZ,

    deine Lösung scheitert leider auch an den Kommas im 1. Feld.

    Bisher ist die von mir (zum 2d-Array ergänzte) Lösung:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    $iStart = TimerInit()
    $sData = FileRead(@ScriptDir & '\datei2.csv') & ',' ; Datei einlesen und ein Komma anhängen für den letzten Datensatz
    $sData = StringReplace($sData, @CRLF, ',') ; alle Zeilenenden durch ein Komma ersetzen
    $aData = StringRegExp($sData, '(".+?"|.*?),', 3)
    Global $aDaten[UBound($aData)/10+1][10]
    for $i = 0 to UBound($aData)-1
    $aDaten[int($i/10)][Mod($i,10)]=$aData[$i]
    Next
    $iEnd = TimerDiff($iStart)
    ConsoleWrite($iEnd & " ms" & @CRLF)
    _ArrayDisplay($aDaten)

    [/autoit]

    von Oscar die schnellste scheitert allerdings bei diesen Daten:

    Code
    "Nachname","Vorname","Straße","Hausnummer","PLZ","Ort","Anzahl","Verbrauch","Musterartikel","Musterart"
    "Musterman","Fritz","Feierstr.",5,23333,"Hamelhausen",5,3050,"1","3"
    "Müller","Heinz Dr.","Feldstr.",1,23455,"Aschendorf",,7700
    "Musterfrau","Victoria, Dr.","Abendrotstr.",7,23455,"Aschendorf",3,,"1","3"

    da der DS "Müller" nicht alle Felder enthält werden beim nachfolgenden Datensatz die Felder verschoben,

    mfg autoBert

    • Offizieller Beitrag

    Kannst du die Erstellung der CSV-Datei nicht beeinflussen?
    Dein Beispiel liefert einen recht wilden Mix von Daten, die mal in Anführungszeichen eingefasst sind und mal nicht. Hier sollte eigentlich gelten: Alles oder nichts.
    Da in der Überschrift alle Feldnamen in Anführungszeichen eingefasst sind leitet sich daraus eigentlich auch die Bewertung des Dateiinhaltes ab. Also alles mit Anführungszeichen. Somit arbeitest du bereits mit einer fehlerhaften Datei.
    Ich verwende allerdings in CSV-Dateien niemals Anführungszeichen, da diese Dateien perse als Text behandelt werden ist eine Stringeinfassung eigentlich sinnfrei.

  • AutoBert, d


    Nein ich habe nichts verkürzt, nur den letzten DS ein Stelle nach oben verschoben. Aufgefallen ist es mir als ich die Zeit für die RegEx-Lösung test wollte und auf die aufgeblähte Testdatei (immer die gleichen 3 Datensätze hinter einander kopiert) loslies. Der Zeitunterschied ist enorm 38 Sekunden gegenüber 209 Sekunden von meinem Skript (über Zusammenstringen ohne RegEx) für 99999 DS

    Edit: war ein Kopierfehler von mir beim 1. kopieren aus dem Board

    mfg autoBert

  • autoBert: stimmt, denn die Funktion trennt strikt nach Komma und ein Token "Victoria,Dr" wird auch getrennt. Wenn ich den Delimiter ersetze, damit die Trennung eindeutig ist, funzt die Funktion.

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    $gs_dummydata = _
    '"Nachname"|"Vorname"|"Straße"|"Hausnummer"|"PLZ"|"Ort"|"Anzahl"|"Verbrauch"|"Musterartikel"|"Musterart"' & @CRLF & _
    '"Musterman"|"Fritz"|"Feierstr."|5"|"23333"|""Hamelhausen""|"5"|"3050"|""1"|"3"' & @CRLF & _
    '"Musterfrau"|"Victoria,Dr."|"Abendrotstr.""|"7"|"23455"|""Aschendorf""|"3"|""|""1"|"3"' & @CRLF & _
    '"Müller"|"Heinz,Dr."|"Feldstr.""|"1"|"23455"|""Aschendorf""|""|"7700"|""1"|"3"'

    [/autoit] [autoit][/autoit] [autoit]

    Global $aS = StringSplitW($gs_dummydata, "|")
    _ArrayDisplay($aS)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ======================================================================================
    ; Name ................: StringSplitW()
    ; Version .............: v0.90 build 2012-05-30 beta
    ; Description .......: Splits a string into columns instead of rows as it is done by SplitString(), like a csv file to a 2d array ;)
    ; Syntax ..............: StringSplitW($string, $delimiter, $max_width)
    ; Parameters ........: $string - string to split
    ; $delimiter - the delimter how to split the string
    ; Return values ....: Success - 2d array
    ; Failure 1 - either $string or $delimter is not set
    ; Failure 2 - array width exceeded
    ; Failure 3 - 2D array memory exceeded -> width + height > 0x5EFA
    ; Author ..............: UEZ
    ; Modified ............:
    ; Remarks ............:
    ; Related ..............: StringSplit()
    ; =================================================================================================
    Func StringSplitW($string, $delimiter)
    If $string = "" Or $delimiter = "" Then Return SetError(1, 0, 0)
    Local $chk, $width, $i, $j, $k, $len, $max = 1, $max_width
    Local $aPos[1], $l = 0
    Local $aSplit = StringSplit($string, @LF)
    $max_width = 0x5EFA - $aSplit[0]
    If $max_width < 1 Then Return SetError(3, 0, 0)
    Local $aVertical[$aSplit[0]][$max_width]
    For $k = 1 To $aSplit[0]
    $len = StringLen($aSplit[$k])
    If $len > 1 Then
    $chk = StringReplace($aSplit[$k], $delimiter, $delimiter)
    $width = @extended
    If $width > $max_width Then Return SetError(2, 0, 0)
    If $width >= $max Then $max = $width + 1
    Switch $width
    Case 0
    $aVertical[$l][0] = $aSplit[$k]
    Case Else
    Dim $aPos[$width * 2 + 2]
    $j = 1
    $aPos[0] = 1
    For $i = 0 To $width - 1
    $aPos[$j] = StringInStr($aSplit[$k], $delimiter, 0, $i + 1) - 1
    $aPos[$j + 1] = $aPos[$j] + 2
    $j += 2
    Next
    $aPos[UBound($aPos) - 1] = StringLen($aSplit[$k])
    $j = 0
    For $i = 0 To UBound($aPos) - 1 Step 2
    $aVertical[$l][$j] = StringMid($aSplit[$k], $aPos[$i], $aPos[$i + 1] - $aPos[$i] + 1)
    $j += 1
    Next
    EndSwitch
    $l += 1
    EndIf
    Next
    ReDim $aVertical[$l][$max]
    Return $aVertical
    EndFunc

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • stimmt ich habe die Lösung bereits eingestellt. Allerdings ist die Laufzeit enorm langsam. Mein Benchmarktest:


    Dein Hauptfehler war es, dass du die Splitergebnisse der Zeilen auch noch in Buchstaben zerlegt hast, was garnicht notwendig ist. Hier mal mein oben skizzierter Lösungsweg ohne Reguläre Ausdrücke:

    Spoiler anzeigen
    [autoit]


    #include <file.au3>
    #include <array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $csv = @ScriptDir & "\test_fail.csv"

    [/autoit] [autoit][/autoit] [autoit]

    ;~ dim $anew
    ;~ _FileReadToArray($csv,$anew)
    ;~ dim $temp
    ;~ For $i = 1 to $anew[0]
    ;~ $temp &= $anew[$i] & @CRLF
    ;~ Next

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Dim $temp2
    ;~ for $i=1 to 25000
    ;~ $temp2 &= $temp
    ;~ Next

    [/autoit] [autoit][/autoit] [autoit]

    ;~ FileWrite(@ScriptDir & "\testbig.csv",$temp2)

    [/autoit] [autoit][/autoit] [autoit]

    $start = TimerInit()
    $aResult = _csv2array2d($csv)
    ConsoleWrite("ZeitTotal: " & TimerDiff($start) & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ;_ArrayDisplay($aResult)

    [/autoit] [autoit][/autoit] [autoit]

    Func _csv2array2d($file)

    [/autoit] [autoit][/autoit] [autoit]

    Local $aCSV
    $start1 = TimerInit()
    _FileReadToArray($file,$aCSV)
    ConsoleWrite("ZeitReadArray: " & TimerDiff($start1) & @CRLF) ; bisschen lahm, geht vermutlich mit fileread flotter
    $start2 = TimerInit()
    _ArrayDelete($aCSV,0)
    ConsoleWrite("ZeitDelArray: " & TimerDiff($start2) & @CRLF) ; wäre ebenfalls nicht notwendig wenn man fileread verwendet

    [/autoit] [autoit][/autoit] [autoit]

    Local $aSplitRows = StringSplit($aCSV[0],",",2)
    $aSplitRows = fixSplitFail($aSplitRows) ; referenzwert für die Spaltenanzahl

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $aReturn[UBound($aCSV)][UBound($aSplitRows)]

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 to UBound($aCSV)-1
    $aSplit = StringSplit($aCSV[$i],",",2)
    If UBound($aSplit) <> UBound($aSplitRows) Then $aSplit = fixSplitFail($aSplit) ; nur wenn spaltenanzahl vom referenzwert abweicht liegt ein splitfehler vor
    ;$aSplit = fixSplitFail($aSplit) ; kostet zuviel zeit das jedesmal zu machen
    For $j = 0 to UBound($aSplit)-1
    $aReturn[$i][$j]=StringReplace($aSplit[$j],'"',"")
    ;ConsoleWrite($aSplit[$j] & @CRLF)
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Return $aReturn

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func fixSplitFail(ByRef $aFail)

    [/autoit] [autoit][/autoit] [autoit]

    Local $aReturn[UBound($aFail)]
    Local $k=0

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 to UBound($aFail)-1
    If StringLeft($aFail[$i],1) = '"' And StringRight($aFail[$i],1) <> '"' Then
    Do
    $aReturn[$k]&=$aFail[$i] & ","
    $i+=1
    Until StringRight($aFail[$i-1],1) = '"'
    $i-=1
    $aReturn[$k]=StringTrimRight($aReturn[$k],1)
    Else
    $aReturn[$k]=$aFail[$i]
    EndIf
    $k+=1
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ReDim $aReturn[$k]
    ;_ArrayDisplay($aReturn)
    Return $aReturn
    EndFunc

    [/autoit]


    Bei 100.000 Datensätzen mit Splitfehlern (kopierte Beispiel CSV) braucht meine Variante ca. 11sek.
    Deine/Oscars 2D-RegEx Version benötigt für das selbe ca. 6sek, ist also auf jedenfall schneller.
    Bei einer CSV, welche keine splitfehler enthält erreicht meine Variante 7sek, die Regex Version bleibt unverändert bei 6sek.

    Allerdings ist mit aufgefallen, dass dein Output Array 1 Zeile zu groß geraten ist. Ausserdem ist es bei meiner Lösung nicht notwendig, dass der Referenzdatensatz (Zeile 1) fehlerfrei gesplittet wird (deine Version) bzw die Spaltenanzahl bekannt ist (regex 2D Version).

    Man kann also durchaus auch ohne RegEx eine performante Lösung basteln, mit einigen kleineren Optimierungen könnte meine Variante im günstigsten Fall (also ohne Splitfehler) evtl. sogar an die RegEx Variante rankommen. :)

  • Hallo Zusammen,

    sorry das ich mich erst jetzt wieder zu Wort melden kann... :S

    Vielen vielen Dank für den Hirnschmalz den Ihr aufgebracht habt!!! :thumbup:

    BugFix Ich bekomme die Daten von anderer leider echt sehr Unflexiblen Stelle und versuche erstmal einfach damit zu leben... Bemängelt hatte ich das natürlich auch schon... ?(

    Da ich die Daten immer nur Stückweise in kleineren Einheiten zum weiterverarbeiten erhalte, sind die Lösungen von autoBert und Oscar völlig ausreichend und die Geschwindigkeit nicht so sehr Ausschlag gebend!

    Für mich ist die Sache damit gelöst!!! Vielen Dank Euch allen.