Text in einer grossen Datei ersetzen - wie am schnellsten?

  • Hi
    Ich brauch mal eure Erfahrung.
    Habe folgendes Problem. Ich habe immer wieder Textdateien (bis zu 40MB groß!). Diese Datei nenne ich jetzt einmal Logfile.
    Teileweise gibt es in diesen Zeilen Texte in einer anderen Sprache (z.B. Englisch).
    Ich habe zusätzlich noch eine deutsch.txt und eine englisch.txt Datei. In diesen beiden Dateien stehen alle möglichen Einträge die es in der Logfile Datei gibt.

    Ich lese nun die erste Zeile der englisch.txt und die erste Zeile der deutsch.txt ein und kontrollieren dann über filereadline jede Zeile in der Logfile.txt. Falls diese Zeile mit der ersten Zeile der englisch.txt übereinstimmt, ersetze ich diese durch die erste Zeile der deutsch.txt usw. Dann lese ich die zweite Zeile der englisch.txt und der deutsch.txt ein und beginne damit von vorne.
    In der englisch.txt und in der deutsch.txt stehen ungefähr 200 Zeilen.
    Das dauert natürlich eine ganze Zeit. Ich glaube das die Lösung mit dem Filereadline noch nicht die beste ist.
    Ich habe auch schon einmal versucht die ganze Logfile.txt in die Zwischenablage zu kopieren und dort den Text zu ersetzen, das schafft aber kein Rechner. Die hängen sich sogar noch mit 2GB Ram auf!
    Habt ihr eine Idee wie man das besser lösen kann? Wie bekomme ich das schneller hin?

    Gruß Autoirrer

  • Ich habe vor einigen Monaten, ein ähnliche Problem gehabt. Nur waren die Dateien dort nicht ganz so groß und ich musste nicht ersetzen sondern nur suchen.

    Die schnellste Variante war bei mir, Fileopen+Fileread (in möglichst großen Stücken, bei mir so weit ich mich erinnern kann, 5MB) in eine Variable und dann in deinem Fall ein StringReplace. (Anschließndes FileClose natürlich).
    Nur must Du darauf achten, das beim lesen der (5MB)-Blöcke, nicht die Zeile getrennt wird. Dann ist die 'komplette' Zeile weder in dem ersten, noch im zweiten Teil.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Hallo!

    hört sich interessant an:
    meine Fragen:

    a, wieviele Zeilen hat so ein Logifle von Dir (nehm mal einen vernünftigen Editor wie z.B. den PFE (der geht wenigstens richtig schnell) und spring mal in die letzte Zeile

    b, wie lange ist ungefähr so ne Zeile?? (sind die alle gleich lang oder von mir aus zwischen 100 und 180 Zeichen??)

    c, kannst Du die Datei noch in ein array laden??

    schau mir das gerne an, hab mit noch größeren "Geräten" zu kämpfen (von nem IBM-Host), aber zu ner vernünftigen Antwort brauch ich erst mehr input.

    Man kann auch die Datei in Teilen in ein Array einlesen (das ist aber schon etwas aufwendiger, wenn die Zeilen nicht identisch lang sind, wenn die alle mit Blank auf der gleichen Länge sind, dann geht das sehr einfach.

    Grüße

    Holzwurm

    • Offizieller Beitrag

    Die Dateien alle mit FileRead einlesen und dann mit StringSplit jeweils ein Array daraus erstellen. Danach die Einträge im Array vergleichen und ein Ausgabe-Array erstellen. Erst am Schluss das Array dann in die Zieldatei speichern.

    Oder versuchen die eingelesene Datei mit String-Operationen (StringReplace, StringRegExpReplace, etc.) entsprechend zu bearbeiten. Für genauere Angaben bräuchte man mal eine Beispieldatei von allen drei Dateien.

  • Hallo AutoIrrer!

    hier mal ein kleiner Ansatz von mir, als Diskussionsgrundlage:

    ich hab ne Testdatei mit 33MB damit gerade durchgenudelt:

    zuerst machst Du Dir ne de.txt mit den Such-Ersetzungsbegriffen:
    access;zugriff
    file;datei
    size;Größe
    owner;Eigentümer

    diese in Dein Arbeitsverzeichnis, meine Textdatei ist die mq573 auch im Arbeitsverzeichnis:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Beispiel: Einlesen der Datei in ein Array
    ; Zeilenweises abarbeiten
    ; Austausch von gefundenem Text und Ausgabe als STring

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

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

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

    $translatefile=@workingdir & "\de.txt"
    $textdatei=@workingdir & "\mq573"
    $newfile=@workingdir & "\fertig.txt"

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

    $pfile=Fileopen($newfile,1)

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

    ; ***Übersetzungstabelle laden
    Dim $translatearray
    _FileReadtoArray($translatefile,$translatearray)

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

    ; ***

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

    ; ******TEXTDATEI abarbeiten
    Dim $textarray
    If Not _FileReadToArray($textdatei,$textarray) Then
    MsgBox(4096,"FEHLER", " Datei " & $textdatei & " nicht gefunden, oder leer")
    Exit
    EndIf

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

    For $x = 1 to Ubound($textarray) -1 ; jetzt wird das array von Zeile 1 bis zur lezten Zeile eingelesen
    $Zeile=$textarray[$x]
    ; msgbox(0,"ich hab jetzt die Zeile mit folgendem Inhalt:", $zeile)
    $Ausgabe=_checkandreplace($zeile)
    FileWrite($pfile, $Ausgabe & @CRLF)
    Next

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

    FileClose($pfile)

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

    ; *******ENDE TEXTDATEI abarbeiten

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

    Func _checkandreplace($zeile)

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

    For $r=1 to Ubound($translatearray)-1

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

    $Uebersetzzeile=StringSplit($translatearray[$r],";")
    if $Uebersetzzeile[0]=2 then ; Kontrolle, ob die Übersetzungstabellenzeile OK is
    $text_e=$Uebersetzzeile[1]
    $text_d=$Uebersetzzeile[2]
    if StringRegExp($zeile,".*" & $text_e & ".*") then
    $neuezeile=StringReplace($zeile,$text_e,$text_d)
    ; msgbox(0,"Kontrolle ist besser", $neuezeile)
    Return ($neuezeile)
    else
    $neuezeile=$zeile
    EndIf
    else
    $neuezeile=$zeile ; eine Zeile in der Übersetzungstabelle war nicht OK
    EndIf

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

    Next
    Return ($neuezeile)

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

    EndFunc

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


    Viel Spaß damit, bei Problemen: melden


    Grüße

    German
    PS: ich war heute im Laden von sieben frühs bis drieviertel sieben heute abend vor der Mühle gesessen, also nicht auszuschließen, das da irgendein Fehler drin ist, bin nur ein Mensch und keine Maschine.

  • Hallo Autoirrer!

    wie siehts aus, bin an Deinem Testergebnissen brennend interessiert, hab hier in meiner Sammlung auch noch andere Lösungsmöglichkeiten, wenn richtige "Geräte" von Text-Files da sind.

    Grüße

    German