Hi Leute,
ich schreibe gerade ein Tool, dass CSV-Dateien einlesen und einzelne Spalten und/oder Datensätze extrahiert. Als DB nutze ich SQLite (SQLite3.dll und SQLite3.exe).
Vor dem Einlesen in die DB, prüfe ich ob der Zeichensatz UTF8 ist, und speichere den Inhalt gegebenenfalls im gewünschten Zeichensatz in eine neue Datei zum Importieren (für SQLite3.exe) oder zum Exportieren.
Ich habe hier nichts Ausführbares. Die Funktion ist aber so überschaubar, dass alles eigentlich direkt offensichtlich sein sollte:
Func _ConvertFileEncoding($sInputFile, $sOutputFile, $iCodepage)
Local $hFileOpen = FileOpen($sInputFile)
If $hFileOpen = -1 Then
Return SetError(1)
EndIf
Local $bFileMove = False
If $sOutputFile == $sInputFile Then $bFileMove = True ; Dann wird eine temporäre Datei geschrieben, die im Anschluss das Original ersetzt.
Local $sTemp, $sTempFilePath = @ScriptDir & "\Temp.csv"
If $bFileMove Then
Local $hFileOpenDest = FileOpen($sTempFilePath, BitOR($FO_OVERWRITE, $iCodepage))
Else
Local $hFileOpenDest = FileOpen($sOutputFile, BitOR($FO_OVERWRITE, $iCodepage))
EndIf
If $hFileOpenDest = -1 Then
Return SetError(2)
EndIf
FileSetPos($hFileOpen, 0, $FILE_BEGIN) ; Voodoo. Eigentlich müsste die Position schon Null sein.
Do
$sTemp = FileRead($hFileOpen, 30000) ; Zur Schonung von Arbeitsspeicher wird die Datei evtl. nach und nach eingelesen und geschrieben.
FileWrite($hFileOpenDest, $sTemp)
Until $sTemp == ""
FileClose($hFileOpenDest)
FileClose($hFileOpen)
If $bFileMove Then FileMove($sTempFilePath, $sInputFile, $FC_OVERWRITE)
EndFunc ;==>_ConvertFileEncoding
Alles anzeigen
Eine Datei mit etwa 430MB kostet hier etwa 8.5 Sekunden. Das scheint mir eigentlich in Ordnung. Allerdings ist meine GUI in dieser Zeit nicht bedienbar (größere Dateien würden das Problem natürlich noch vergrößern). Daher werde ich die Funktion wohl in eine weitere Exe auslagern.
Vorher wollte ich aber mal fragen, ob die Funktion gut ist, oder was ich ändern sollte.
Oder sollte ich gleich ein anderes Tool nutzen?
(iconv sah mir jetzt nach einer eher umständlichen Lösung aus, weil es nicht ohne Vorbereitung/Installation läuft?)
Ich bin für alle Hinweise dankbar.
PS: Ich habe den Code als C angegeben, weil bei AutoIt die Kommentare ausgeblendet werden!?!