Wie Zeichensatz einer Datei effizient bearbeiten?

  • 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:

    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!?!

    Grüße autoiter

  • Hallo Autoiter,

    kann die Datenbank beim Import nicht einen einheitliche Codierung? IAb und an läßt sich das ja beim Import einstellen?

    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Hallo Peter S. Taler

    Wenn ich es nicht falsch sehe leider nicht.

    Ich hielt es für schneller (ist es sicher auch) und sicherer für den Import und Export die sqlite3.exe zu nutzen. Ich mache das also nicht selbst sondern starte das Konsolenprogramm. Das bringt bestimmte Einschränkungen mit - etwa weniger als tausend Spalten und eben auch UTF8. Exportiert wird immer als UTF8 ohne BOM (und muss dann u.U. auch konvertiert werden).

    Grüße autoiter

  • Hallo Autoiter,

    es gibt da noch ein (mittlerweile) Freeware Ttool das auch von der Kommandozeile läuft - ich habe keine Ahnung ob da in Sachen Speed was geht, das sollte ein Vergleich zeigen, aber in anderen Foren wird das Tool empfohlen...

    http://www.melody-soft.com/html/unifier.html

    Du kannst ja mal Deine 450 MB durchlaufen lassen - dann wird man sehen..

    Gruß

    Peter

    Edit 1: Freischaltcode ist ganz unten auf der Seite

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Und über die Powershell?:

    AutoIt
    _convFile2UTF8("Test.txt", "TestUTF8.txt")
    
    Func _convFile2UTF8($s_Input, $s_Output)
        Local $s_Command = StringFormat('Get-Content "%s" | Set-Content -Encoding utf8 "%s"', $s_Input, $s_Output)
        ShellExecuteWait("powershell.exe", $s_Command, @WorkingDir, "open", @SW_HIDE)
    EndFunc
  • Eine Datei mit etwa 430MB kostet hier etwa 8.5 Sekunden.

    Also ehrlich... du musst dich einfach nur entscheiden, was du willst... entweder Voodoo und den Arbeitsspeicher schonen (30000 Bytes ist ja ein Witz!) oder maximalen Speed! 8o

    Meine Speed-Version sähe deshalb so aus...

    AutoIt
    Func _ConvertFileEncoding($sInputFile, $sOutputFile, $iCodepage)
        Local $sData = FileRead($sInputFile) ; Wenn du bei FileOpen keine Codepage angibst, ist es überflüssig!
        If Not @extended Then Return SetError(1)
        
        Local $hFile = FileOpen($sOutputFile, BitOR($FO_OVERWRITE, $iCodepage))
        If $hFile = -1 Then Return SetError(2)
    
        FileWrite($hFile, $sData)
        Return FileClose($hFile)
    EndFunc   ;==>_ConvertFileEncoding
  • Hallo Leute,

    Bitnugger

    Hehe, AutoIt für Fortgeschrittene, wie? Wer sich mit Voodoo-Zeilen selbst disqualifiziert, wie ich es getan habe, darf sich aber wohl nicht beschweren. :D

    AspirinJunkie

    Bei meiner Recherche bin ich auch über PowerShell gestolpert. Aber auch gleich, "wie prüfe, ob PowerShell vorhanden ist". Da wollte ich lieber etwas, dass dem Programm beiliegt. Ich habe nun aber gelesen, dass PowerShell seit Win 7 dabei ist und eigentlich reicht mir das auch aus.

    Der ShellExecuteWait-Aufruf hat bei einem Test eben nicht funktioniert. Liegt nicht am PowerShell-String. Der ist richtig.

    EDIT1:

    Bei mir funktioniert es nicht über einen Start der powershell.exe. Ich kann irgendetwas mit AuoIt lesen und dann ist das Fenster schon weg. Ausführungsbeschränkungen?

    Grüße autoiter

    Einmal editiert, zuletzt von autoiter (20. März 2018 um 10:14)

  • Bei mir funktioniert es nicht über einen Start der powershell.exe. Ich kann irgendetwas mit AuoIt lesen und dann ist das Fenster schon weg. Ausführungsbeschränkungen?

  • autoiter.

    ich habe das gesehen daher - Programm instaliert - Kopie vom Ordner - Programm deinstaliert - aus gesichertem Ordner gestartet - läuft - Einschränkung man kan die Seriennummer nicht eingeben - aber das Kommandlinemodul scheint diese nicht zu benötigen.....

    Könnte also funktionieren. Habs aber nur bis hierher ausprobiert.

    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Peter S. Taler

    Danke für den Tipp :)

    Gut zu wissen. Allerdings will ich das hierfür lieber nicht nehmen, weil das bei uns in der Firma genutzt wird und ich nicht weiß, ob das vollkommen in Ordnung ist.

    Bitnugger

    Problem erkannt. Was ich da kurz mit AutoIt lesen kann, ist der Pfad zu meinen Testdateien. Der enthält Leerzeichen. Das ist das Problem.

    Grüße autoiter

  • Verstehe ich,

    kann aber kein problem Sein. Auf der Seite steht - Firma erloschen - Software = Freeware. Schlüssel zur allgemeinen Verwendung liegt auf der Seite - also da sehe ich kein Problem.

    Anyway - ich verstehe Deine Vorsicht - zumal es ja Lösungen in Autoit gibt.

    Neugierig wie ich bin - was wirds wenns fertig ist? Ich sollte hier mal ein Tool bauen, mit dem man Daten aus DBX Datenbanken auslesen kann - drücke mich aber z.Z. erfolgreich darum...


    Gruß

    Peter

    Ps.: Leerzeichen im Pfad - ich prüfe bei Kommandozeilen grundsätzlich ab und lasse keine zu - spart Arbeit

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Ich möchte abschließend schreiben, dass ich mich am Ende für AutoIt entschieden habe. Damit möchte ich niemandem abraten, das von Peter S. Taler genannte Programm zu nutzen. Ich wollte es hier einfach nicht.

    Die PowerShell-Nutzung erwies sich als marginal schneller (auf 500MB im Schnitt eine dreiviertel Sekunde). K.O. Kriterium war hier, dass die genannte einfache Methode nicht mit UTF8 ohne BOM funktioniert. Ansonsten ist PowerShell aber ein wirklich nettes Feature.

    Danke an alle Ratgebenden.

    Grüße autoiter

  • Ein Tool mit dem man einzelne Spalten oder Datensätze aus CSV Dateien extrahieren kann. Ziemlich plump eigentlich .

    Die Spalten einer CSV ändere ich per Regex(Replace). Auch per Regex kann man sich einzelne Spalten holen, bzw. die "überflüssigen" Spalten (per RegexReplace mit "") löschen

    Ziemlich plump eigentlich

    Das ist überhaupt nicht plump, sondern State of the Art!:thumbup:

    Besser jedenfalls, wie neulich gesehen, die CSV in eine Excel-Tabelle zu laden, dort per AutoIt zu bearbeiten und dann wieder als CSV zu speichern....:Face:

    Bin ja sonst auch eher einer von denen die sagen "Hauptsache funktioniert!", aber von hinten durch die Brust ins Auge und so langsam wie nur technisch möglich....neee...

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (29. März 2018 um 18:05)

  • Hallo Andy :)

    Die Spalten einer CSV ändere ich per Regex(Replace). Auch per Regex kann man sich einzelne Spalten holen, bzw. die "überflüssigen" Spalten (per RegexReplace mit "") löschen

    RegexReplace hatte ich ehrlich gesagt gar nicht auf dem Radar. Allerdings hatte ich große Dateien im Blick und dachte daher an SQLite. Jedenfalls habe ich es damit umgesetzt: CSV-Extractor

    Über das andere von dir beschriebene Vorgehen, möchte ich gar nichts schreiben :D

    Grüße autoiter