Datei einlesen bearbeiten und wieder speichern

  • Hallo Leute,

    ich bräuchte etwas Hilfe, weil ich nach zisch tausenden experimenten nicht zum richtigen Ergebnis komme.

    Ich habe eine Datei, die 42000 Tausend Zeilen hat.
    Die Zeilen sind in folgendem Format
    ----------------------------------------------------------------------
    Auto
    Feld 1
    {Schnelle Autos}
    1 Audi
    2 BMW
    3 Mercedes

    {langsame Autos}
    4 Fiat
    5 Lada

    Feld 2
    {Farben der Autos}
    1 Grau
    2 {nicht schön} Lilla
    3 Rot
    ...

    Haus
    Feld 1
    {große Häuser}
    1 Palast
    2 Burg

    {kleine Häuser}
    3 Bungalow
    4 {für Tiere} Scheune
    ...
    ----------------------------------------------------------------------

    Und es geht immer so weiter.
    Jetzt brauche ich folgendes Ergebnis:
    1. Alle leere Zeilen löschen
    2. Alle Zeilen die nur die Klammern {mit Wörter drin} löschen ausser die Klammern die in den Zeilen stehen mit vorangehender Zahl.
    3. Nach dem Hauptwort z.B. Haus steht immer Feld 1 dann kommen die Einträge dann Feld 2 wieder die Einträge Feld 3 usw.: Das Wort Feld soll dann jeweils mit dem Hauptwort überschrieben werden und das Hauptwort dann anschließend gelöscht. Also würde dann Haus 1, die Einträge, Haus 2 usw. stehen.

    Ich habe versucht die Datei in eine Array einzulesen und mit "For $i = 0 To UBound($aArray) - 1" zu verarbeiten, das dauert aber EWIG.
    Leere Zeilen habe ich so verucht, da werden mir aber auch andere gelöscht.
    If $aArray[$i] = "" Then _ArrayDelete($aArray, $i)

    Für den Rest stehe ich sowieso auf dem Schlauch.

    Kann mir da jemand weiter helfen?

    Danke schon mal für die Mühe!

  • Sollte ausreichend kommentiert sein...

    Spoiler anzeigen

    Das ersetzen der Feld-Wörter durch die jeweiligen Hauptwörter könnte ein RegEx-Meister sicher auch in einem Pattern für StringRegexpReplace unterbringen. :D

    LG
    Christoph :)

  • Was die geschwindigkeit angeht: Poste mal das ganze Script. Ich vermute, du hast da ein paar stellen, die ausbremsen. Dann können wir das schneller machen.
    Hab dir mal nen Script geschreiben. kannst ja mal testen. Müsste ziemlich schnell durchlaufen ;D

    Falls du an dem Code etwas nicht verstehst kannst du mich gerne fragen :)

    Edit: Da war @Christoph54 schneller :D

  • Danke euch beiden!

    Das funktioniert eigentlich von euch beiden ganz gut was aber bei beiden nicht geht und womit ich große Probleme habe ist:

    Wenn da Wörter auf anderer Sprache wie russisch drin vorkommen, dann speichert es mir immer alle Buchstaben als ????????? Fragezeichen ab. Wenn ich es in arraydisplay ausgebe steht es noch richtig drin.

    Wie kann ich denn das umgehen? Das ist für mich sehr wichtig.

  • Beim Fileopen musst du angeben, welches TextFormat deine Datei benutzt. (Kannst du leicht herausfinden, wenn du Notepad++ öffnest und dann dort unter Kodierung nachsiehst.) Bei Fileopen dann einfach die Passenden Flacks setzen. (Bei mir müsste beim FileReadToArray statt des Dateinamens der handle übergeben werden, der bei fileopen herauskommt:)

    Code
    $hFile=FileOpen($file,FLAG)
    $ar=FileReadToArray($hFile)
    FileClose($hFile)

    Für die Flags: siehe Hile. Standartmäßig wird glaub ich ANSI verwendet. (ISO...) Für russische Zeichen benötigst du vermutlich UTF8 (FLAG: 128), musst du aber mit Notepad++ oder ähnlichem mal gucken.
    Fürs speichern gilt dasgleiche ;)

  • Statt nur FileWrite() mach das:

    AutoIt
    Local $file = FileOpen("wasweißich.txt", 128) ; = $FO_UTF8 oder ein anderes UNICODE-Format
    FileWrite($file, $sData)
    FileClose($file)

    Edit: lel...zu spät :D