Textdatei scannen und gewisse Zeilen angeben/ersetzen

  • Verschneite Grüße aus dem weißen Mecklenburg-Vorpommern :D

    Alsoo :)
    Auch wenn mich meine Programmierzeit schon durch so einige Befehle gebracht hat, habe ich Neuland für mich gefunden.
    Es geht um das Auslesen/Verändern von .txt Files.

    Ich habe einige Textdatein bei mir auf meinem anderen PC, bei denen ich einige Informationen für einen schnellen Überblick hinausfiltern möchte.
    Da ich mich gerade an meinem Laptop befinde und zu faul bin um den genauen Inhalt zu finden Tippe ich hier mal ein ungefähres Beispiel:



    Ich möchte aus der Datei auslesen:
    - Bezirk + Nummer (alles was danach kommt ist unwichtig)
    - Alle C-Straßen mit Nummer
    - Die Zahlen danach. Hier kommt mein nächsten Problem;
    Die Zahlen dabei haben Bedeutungen.
    Dabei gehören 2 Zahlen immer zusammen

    C- Straße 12; 0 1 1 3 2 1 3 1



    Die erste Ziffer ist immer ein Haus (in diesem Beispiel) dabei soll dann jede 0 durch "NULL" ersetzt werden. Die zweite Ziffer bedeutet dann den Zustand. Bei 1 soll also "Hervorragend" bei 2 "Gut" bei 3 "Baufällig" ausgegeben werden.
    Wie kann ich das also so auslesen lassen, dass im Endeffekt eine Textdatei entsteht, die ungefähr so aussieht:

    Zitat

    Bezirk 1

    C-Straße 1; NULL Gut EINS Baufällig ZWEI Gut


    Vllt sogar in verschiedenen Zeilen :)
    Achja. Und die Reihenfolge der Zahlen kann variieren:

    0 1 3 1 9 1 18 1

    Definierbar trotzdem, denn die Zahlen gehen nur bis gegen 20 hoch.
    Wie gesagt, das ist nur ein Beispiel wie das ungefähr aussieht in meinen Texten.

    Ein paar Vorschläge (keine kompletten Lösungen) würden mich freuen.

    Vielen Dank schonmal :)

  • In Autoit gibt es ein paar nützliche Funktionen für dein Problem:
    -StringInStr() durchsucht einen String nach einem definierten Substring.
    -Verschiedene StringIs... Funktionen, welche die Art eines Strings überprüfen z.B. StringIsDigit() überprüft ob ein String nur Zahlen von 0-9 enthält
    -StringLeft und StringRight geben eine bestimmte Anzahl Zeichen aus einem String zurück, von links oder Rechts ausgehend.
    -Die String.au3 Funktionen werden da bestimmt auch nützlich sein.
    -Auslesen aus einer Textdatei kannst du das ganze mit FileRead() bzw. schreiben kannst du mit FileWrite, falls du noch weitere Modi benötigst einfach vorher mit $i = FileOpen() und dem gewünschten Modus öffnen und dann jedesmal statt dem Dateinamen die Variable verwenden. Am Ende des Scripts oder wenn du einen anderen Modus benötigst einfach wieder mit FileClose($i) schließen.
    Hoffe ich konnte helfen falls nicht gibt es hier ja genug die mehr darüber wissen als ich. ^^

  • Hallo

    Da ich mich gerade an meinem Laptop befinde und zu faul bin um den genauen Inhalt zu finden

    durch das fehlende einstellen einer solchen Datei nimmst du dir die Möglichkeit Lösungen mit Hilfe von regulären Ausdrücken zu bekommen,

    mfg (Auto)Bert

  • Selbst wenn ich die Datei hier hätte würde ich sie hier nicht so reinstellen :)


    Dachte ich mir schon das Ganze mit String und File Befehlen zu machen.
    Ich werd mich ma ransetzen.

    Kann ich wenn ich StringInStr() benutze auch in eine Variable die Zeilennummer definieren lassen? Würde es vllt vereinfachen.

  • So ungefähr?

    Spoiler anzeigen
    [autoit]

    $String = "Vorwort" & @CRLF
    $String &= "-bla" & @CRLF
    $String &= "-bla" & @CRLF
    $String &= "Bezirk 1; unwichtige zahlen" & @CRLF
    $String &= "A- Straße 1; unwichtige zahlen" & @CRLF
    $String &= "B- Straße 1; unwichtige zahlen" & @CRLF
    $String &= "C- Straße 1; 0 1 1 3 2 1 3 1" & @CRLF
    $String &= "Bezirk 2; unwichtig" & @CRLF
    $String &= "A- Straße 2; unwichtige zahlen" & @CRLF
    $String &= "B- Straße 2; unwichtige zahlen" & @CRLF
    $String &= "C- Straße 2; 0 2 1 1 2 2 3 2" & @CRLF
    $String &= "Bezirk 3; unwichtig" & @CRLF
    $String &= "A- Straße 11; unwichtige zahlen" & @CRLF
    $String &= "B- Straße 11; unwichtige zahlen" & @CRLF
    $String &= "C- Straße 12; 0 1 1 3 2 1 3 1 " & @CRLF

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

    ConsoleWrite($String & @CRLF)

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

    $String = StringRegExpReplace(StringRegExpReplace(StringRegExpReplace(StringRegExpReplace(StringRegExpReplace($String,"Vorwort[\w\W]*?(?=Bezirk)",""), _
    "(Bezirk\s*\d+)(?:[\w\W]*?)(C-\s?Straße\s?\d+)(?:.*?)(?:\s*0\s*)(\d)(?:\s*1\s*)(\d)(?:\s*2\s*)(\d)(?:\s*3\s*)(\d)","$1"&@CRLF& _
    "$2 NULL $3 EINS $4 ZWEI $5 DREI $6"),"(?<=NULL |EINS |ZWEI |DREI )3","Baufällig"),"(?<=NULL |EINS |ZWEI |DREI )2","Gut"),"(?<=NULL |EINS |ZWEI |DREI )1","Hervorragend")

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

    MsgBox(0,"",$String)

    [/autoit]


    LG SEuBo

  • So soll es am Ende aussehen, ja :)

    Die Dateien haben aber unterschiedlich viele Zeilen, unterschiedlich viele C-Straßen, und in manchen Bezirken sind auch gar keine relevanten da...
    Achja, und der Text als Vorwort zum Beispiel ist immer unterschiedlich.
    Und die Datein sind unter anderem auch über 500 Zeilen lang. Also nichts was ich bei AutoIt per Hand eingeben möchte -> Lieber mit FileRead arbeiten.

    Danke für deinen Post :) Der hilft mir schonmal :)

  • Und die Datein sind unter anderem auch über 500 Zeilen lang. Also nichts was ich bei AutoIt per Hand eingeben möchte -> Lieber mit FileRead arbeiten.


    Das ist ja kein Problem, ich habe das nur für deinen Beispieltext so gemacht.

    Die Dateien haben aber unterschiedlich viele Zeilen, unterschiedlich viele C-Straßen, und in manchen Bezirken sind auch gar keine relevanten da...

    Da kommen wir jetzt zum lustigen Teil - Ich kann ja nur das verarbeiten, was du mir gibst. In deinem Beispieltext war kein Bezirk mit mehreren oder nicht verwertbaren C-Straßen. Ergo: Den RegExp kann man in die Tonne kloppen. So ein regulärer Ausdruch (RegEx) ist immer auf das Problem maßgeschneidert. Wenn dann etwas "unvorhergesehenes" passiert, war die Arbeit für die Katz'.
    Wenn du die Datei schon nicht öffentlich machen willst, dann kannst du dir ja überlegen, mir mal eine Datei per PN zu schicken; Denn mir ist es vollkommen Wurst, welches Haus in welchem Bezirk Baufällig ist.
    Wenn nicht: Viel Spaß bei der herumquälerei mit String-Befehlen :D

    LG, SEuBo

  • Ja hab auf'm Weg selbst gemerkt dass die Bemerkung doof war.
    Naja. Doppelt kommt da nichts vor. Bloß manchmal kommt in einem Bezirk halt keine C-Straße ist.

    Ist auch egal :)

    Du hast mir sehr geholfen, ich danke dir :)

    Mir würde es eig schon reichen wenn alle Zeilen gelöscht werden, die nicht mit Bezirk oder mit C-Straße anfangen. Danach könnte ich dann die StringRegExReplace Funktion maßschneidern. Alternativ krieg ich das dann auch so hin.

    Einmal editiert, zuletzt von lavido (28. Januar 2010 um 21:34)