Große txt Dateien ändern mit StringRegExpReplace

  • Hey hooo,

    bin gerade dabei einen Converter zu schreiben der große txt dateien (> 4 mio. zeilen) verändern soll (bestimmte werte löschen, und das trennzeichen der verbleibenden verschieben).

    das mit dem löschen funktioniert schonmal und das auch in einer akzeptablen zeit ( falls jemand eine idee hat wie man das noch schneller erledigen kann bitte melden)
    mein problem ist das ich das mit dem verschieben des trennzeichens net auf die reihe bekomme -.-

    Hopefully hat jemand eine idee :)

    ich hab mal mein "script" und eine beispiel datei (vor der umwandlung) angehängt...

    Dankeeeeeee  :)

  • Welches Trennzeichen willst du denn verschieben und wo soll es landen?
    Dürfte egtl. nicht so schwer sein.
    Könntest du vllt die bearbeitete Datei posten damit man sieht wie sie dannach Aussehen soll?

    PS: Wenn die Datei groß ist solltest du sie Zeilenweise einlesen ;)

  • danke für die schnelle antwort :)

    ehm... so solls aussehen:

    -162.760000 389.660000 -32096.670000

    also den punkt genau 2 stellen nach rechts schieben oder die werte mal 100 :D

    geht das wirklich schneller wenn man das zeilenweise macht?

  • Zeilenweise einlesen solltest du nicht wegen der Performance sondern weil du sonst an die Grenze der maximalen Zeichenlänge des Strings kommen könntest. Sozusagen als Sicherheit würd ich es Zeilenweise abarbeiten ;)
    So sollts egtl klappen:

    Spoiler anzeigen

    [autoit]
    Case $ok
    $hlesen = FileOpen($file)
    $hschreiben = FileOpen(@ScriptDir & '\' & 'neu test.txt', 2)
    $sText = FileReadLine($hlesen)
    While Not @error
    $sText = StringRegExpReplace($sText, $such1, " ")
    $sText = StringRegExpReplace($sText, $such3, " ")
    $sText = StringRegExpReplace($sText, "(-?\d+)\.(\d{2})(\d+)", "$1$2.$3")
    FileWriteLine($hschreiben, $sText)
    $sText = FileReadLine($hlesen)
    WEnd
    FileClose($hlesen)
    FileClose($hschreiben)
    [autoit]

    Deine beiden Regexp hab ich nicht angesehn. Ich denke aber dass du das evtl leichter machen kannst wenn du StringinStr und Stringleft verwendest um den rechten Teil "wegzuschneiden"
    Evtl. ist es auch performanter statt meinem RegEx einfach ein Stringformat oder eine Multiplikation zu verwenden...

  • Danke Schnitzel :)

    klappt alles wunderbar :)

    nur das mit dem einzeln einlesen geht überhaupt nicht.... also von der zeit her

    ich hab ne datei mit 5 mio zeilen eingelesen, das dauerte bei einladen der gesamten datei 40 sekunden, mit den einzelnen zeilen bin ich bei fast 5 minuten -.-
    hast du eventuell noch eine andere idee ??

    • Offizieller Beitrag

    Bist du mit dieser Arbeit ausschließlich an einem PC? Dann würde ich dir dazu raten, die Datei mit Lua oder Python zu bearbeiten. Beide Skriptsprachen schlagen AutoIt in der Textverarbeitung um Welten (Zeitbedarf 1/10 oder noch geringer). Das resultiert vor allem daraus, dass RegExp in AutoIt keine generische Verarbeitung implementiert hat. Und bei Dateien dieser Größe vermute ich, würde es Probleme mit rekursiven Aufrufen geben.


    Edit
    Ich habe dir mal die Lua-Lösung erstellt. Kannst du dann aus SciTE heraus starten (die zu bearbeitende Datei mußt du nicht im Editor öffnen, nur das Lua-Skript). Beachte den notwendigen Eintrag für SciTEUser.properties:

    Spoiler anzeigen
  • Danke BugFix, aber iwie komme ich mit der lua nicht klar xD
    allerdings reicht es auch so wie es bis jetzt ist...

    Nun habe ich allerdings ein anderes problem -.- ich muss das selbe nun noch mit anderen daten machen, welche allerdings keine gleichbleibende formatierung haben...

    Die bisherigen daten:

    1.62760000 3.89660000 -320.96670000 30 37 66
    -1.62760000 3.89660000 -320.96680000 30 37 66
    -1.62760000 3.89660000 -320.96710000 30 37 66
    -1.62760000 3.89660000 -320.96670000 30 37 66
    -1.62760000 3.89660000 -320.96680000 30 37 66
    -1.62760000 3.89660000 -320.96720000 30 37 66
    -1.62760000 3.89660000 -320.96700000 30 37 66
    -1.62760000 3.89660000 -320.96610000 30 37 66
    -1.62760000 3.89660000 -320.96660000 30 37 66


    Die "neuen" Daten:

    -0.820000052 -70.165 -14.6300011 159 159 159
    -1.0150001 -69.15501 -18.8300018 156 156 156
    -1.0250001 -68.96001 -19.0350018 156 156 156
    -1.13 -68.41 -21.225 157 157 157
    -1.19 -67.785 -22.54 155 155 155
    -1.22 -66.0750046 -23.26 156 156 156
    -1.225 -66.16 -23.3550014 154 154 154
    -1.225 -66.175 -23.4250011 155 155 155
    -1.235 -65.8950043 -23.585001 154 154 154


    Ich habe überhaupt keine ahnung wie ich das mit der sich ändernden zahlen länge machen soll -.-
    villeicht hat ja von euch einer eine idee :)