Nabend!
Ich habe mir mal selber einen CSV-Parser geschrieben um CSV´s einzulesen, speichern und neu zu erstellen. Alles mit nem 2D-Array! Ich habe die Funktion jetzt nicht mehr Testen können, aber sie sollte funktionieren...
Spoiler anzeigen
Func _CSVparser($sFile, $iStart = 0, $iEnd = 0, $sMode = "Load", $a2DArray = 0)
Local $a2DArrayNeu[1][1], $iRow, $iCol
Switch $sMode
Case "Load"
Local $tmp, $tmpArray
Local $file = FileOpen($sFile)
Local $tmpArray = FileRead($sFile)
FileClose($file)
$tmpArray = StringSplit($tmpArray, @CRLF, 1)
$iRow = $tmpArray[0]
_ArrayDelete($tmpArray, 0)
$tmp = StringSplit($tmpArray[0], ";", 1)
$iCol = $tmp[0]
ReDim $a2DArrayNeu[$iRow][$iCol]
for $i = 0 to $iRow-1
$tmp = StringSplit($tmpArray[$i], ";", 1)
for $j = 0 to $tmp[0]-1
$a2DArrayNeu[$i][$j] = $tmp[$j+1]
Next
Next
Return $a2DArrayNeu
Case "Save"
Local $tmp
Local $file = FileOpen($sFile)
Local $a2DArrayNeu = FileRead($sFile)
FileClose($file)
$a2DArrayNeu = StringSplit($a2DArrayNeu, @CRLF, 1)
$iRow = $a2DArrayNeu[0]
_ArrayDelete($a2DArrayNeu, 0)
$tmp = StringSplit($a2DArrayNeu[0], ";")
$iCol = $tmp[0]
if $iEnd = 0 then $iEnd = $iCol
if $iEnd > $iRow then $iEnd = $iRow
Local $sCSV
for $i = $iStart to $iEnd-1
for $j = 0 to $iCol-1
$sCSV &= $a2DArray[$i-$iStart][$j] & ";"
Next
$sCSV = StringTrimRight($sCSV, 1) & @CRLF
Next
$sCSV = StringTrimRight($sCSV, 2)
$file = FileOpen($sFile, 10)
FileWrite($file, $sCSV)
FileClose($file)
Return 1
Case "New"
$iEnd = UBound($a2DArray,1)
$iCol = UBound($a2DArray,2)
ReDim $a2DArrayNeu[$iEnd]
Local $sCSV
for $i = 0 to $iEnd-1
for $j = 0 to $iCol-1
$sCSV &= $a2DArray[$i][$j] & ";"
Next
$sCSV = StringTrimRight($sCSV, 1) & @CRLF
Next
$sCSV = StringTrimRight($sCSV, 2)
if FileExists($sFile) then FileDelete($sFile)
$file = FileOpen($sFile, 10)
FileWrite($file, $sCSV)
FileClose($file)
Return 1
EndSwitch
EndFunc
Kannste ja mal Testen,
Grüsse!
[EDIT]
Mit $iStart und $iEnd kann man den Bereich wählen der ausgelesen/gespeichert werden soll.
$a2DArray Ist für das Abspeichern wichtig, da mußte eben das CSV-Array angeben welches Gesichert werden soll.
misterspeed: Bei wirklich GROSSEN CSV-Dateien ist diese Möglichkeit viiiiel schneller als mit _FileReadToArray - Da ich einfach Fileread verwende und anschliessend eben mit StringSplit trenne.