Mit _StringBetween nur jedes 1. - 4. - 7. usw. Vorkommen rausfiltern

  • Hallo zusammen,

    ich muss eine XML Seite parsen. Dazu habe ich mir einen ersten großen Block mit _StringBetween rausgesucht. Dann diesen wieder mit _StringBetween unterteilt. Jetzt habe ich meine gewünschten Ergebnisse, jedoch ist es so, dass ich z.B. das 1. Ergebnis benötigte, das 2. und 3. nicht, das 4. wieder, das 5. und 6. nicht, das 7. wieder, usw.

    Wie kann ich denn sowas hinbekommen?

    Einmal editiert, zuletzt von Code4Fun (12. Dezember 2018 um 12:22) aus folgendem Grund: Leider gibt es noch Schwierigkeiten, von daher öffne ich den Thread nochmals

  • Da _StringBetween ja ein Array zurückliefert einfach Step 3 in einer For ... Next benutzen

    Code
    Global $aResult[99]
    
    For $i = 1 to 99
        $aResult[$i-1] = 'Ergebis: ' & $i
    Next
    
    For $i = 0 to UBound($aResult)-1 Step 3
        ConsoleWrite($aResult[$i] & @CRLF)
    Next
  • ich muss eine XML Seite parsen

    Ich hatte vor Kurzem folgendes dazu geschrieben, ggf. hilft es Dir weiter.

    Quellensuche zum Thema 'XML Parser'

    Du könntest mit einer entsprechenden XML-UDF direkt die Blöcke rausholen die du brauchst.


    Ansonsten kannst du uns ja mal deinen Code zeigen mit dem du den die benötigten Blöcke mit _StringBetween unterteilst.

    Du siehst den Wald vor lauter Bäumen nicht.

    Ja, ein Skript würde die weitere Hilfe deutlich erleichtern;) .

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Erst mal vielen Dank. autoBert's Tip mit Step 3 war perfekt. Jetzt habe ich noch folgendes kleines Problem

    Ich sollte noch 3 vorgestellte Tabulatoren parsen. Hier mal die Codezeile, die so nicht geht

    Code
            $line3 = _StringBetween($line2[$i], '<p class="zks_reg_details_content">', {TAB}{TAB}{TAB} & '<br />')

    Wie bilde ich denn sowas ab?

  • Hallo zuammen,

    jetzt muss ich das Ticket nochmals anfassen, da mir eine Sache unklar ist. Doch kurz zur Erklärung, was ich bisher mache (soll irgendwann mal perfekter werden, aber eins nach dem anderen)

    Ich öffne von Hand eine Internetseite, melde mich dort an, klicke ein paar Schaltflächen, bis ich zur Zielseite komme. Dort lasse ich mir den Quelltext anzeigen und markiere alles und kopiere den Inhalt in die Zwischenablage.

    Dann kommt mein Script, welches auch gut funktioniert, bis auf ...

    Mein Script

    Folgendes Problem hab ich irgendwie mit diesen Zeilen

    Code
    If StringInStr($line3[0], "Bevollmächtigter des Erzeugers") Then
                Local $sString = StringReplace($line3[0], "Bevollmächtigter des Erzeugers", "BEV")
    EndIf
    If StringInStr($line3[0], "Erzeuger") And Not StringInStr($line3[0], "Bevollmächtigter des Erzeugers") Then
                Local $sString = StringReplace($line3[0], "Erzeuger", "ERZ")
    EndIf

    Wenn ich das Script via F5 direkt aus SciTE ausrufe, dann wird in der Textdatei der String "Bevollmächtigter des Erzeugers" in den String "BEV" ersetzt.

    Wenn ich jedoch das Script für x64 kompiliere und als EXE aufrufe, dann bleibt "Bevollmächtigter des Erzeugers" erhalten.

    Sorry, das verstehe ich jetzt überhaupt nicht.

    Bräuchte hier bitte mal Unterstützung

    Vielen Dank

  • Hast du mal geprüft, was er bei dem als x64 kompilierten Skript in $line3 stehen hat bevor er die Prüfung macht?

    OT @TE: Wäre hier nicht auch eine select case Abfrage einfacher als die ganzen if then Abfragen? Dann könntest du mit "else" einen Wert eintragen, wenn keine der Strings gefunden wurden (=Fehler?).

    Code
    Select
      Case StringInStr($line3[0], "Bevollmächtigter des Erzeugers")
              Local $sString = StringReplace($line3[0], "Bevollmächtigter des Erzeugers", "BEV")
      Case StringInStr($line3[0], "Erzeuger")
              Local $sString = StringReplace($line3[0], "Erzeuger", "ERZ")
    ;- ...
      Case Else
              ;-Fehlermeldung 
    EndSelect

    2 Mal editiert, zuletzt von Moombas (12. Dezember 2018 um 13:45)

  • Hallo Moombas, jetzt ich raus :)

    Wie kann ich den die Variable prüfen, wenn ich das Script bereits kompiliert habe? Soll ich eine Msgbox dazu verwenden, oder was meinst du genau?

  • Du kannst eine MsgBox verwenden (temporär zum Fehler finden) oder eine Logdatei (z.B. error.txt) schreiben. Es gibt garantiert noch mehr Möglichkeiten aber MsgBox würde ich nur bei wenigen Datensätzen empfehlen die er durchläuft, sonst wirst du damit zugeballert, dann sollte man eine Logdatei nehmen. Aber bei wenigen durchläufen ist MsgBox die einfachste Prüfung.

    Ich nutze beides nach Bedarf wenn ich im laufenden Programm Fehler suchen muss um die Fehlerquelle einzugrenzen. Bei Fehlern eine error.txt (oderr auch error.log) zu schreiben kann ggf. auch in der finalen Fassung sinnvoll sein.

  • Was gibt es dabei nicht zu verstehen? Wenn der Wert nicht ersetzt wird, ist eine Prüfung ob der zu ersetzende Wert überhaupt vorhanden ist durchaus Sinnvoll. Bestes Beispiel hierbei ist das Umlaute nicht als Umlaut verarbeitet wurden etc., das kann man dann mit einer solchen einfachen Prüfung kontrollieren.

    Wenn der Wert vorhanden ist aber trotzdem nicht ersetzt wird (Achtung: auch auf doppelte Leerzeichen etc. prüfen) liegt der Fehler in der Umsetzung der Ersetzen-Routine.

    Wenn der Wert nicht vorhanden ist, liegt der Fehler in der Quelle oder deren Einlese/Entstehungs-Routine.

    Ich nutze hier und in Delphi, wenn die Werte passen, liegt meist ein Logik- oder Programmierfehler vor. Nur ohne es zu prüfen, wer kann sich 100%ig sicher sein, das die Werte passen?

    Einmal editiert, zuletzt von Moombas (12. Dezember 2018 um 14:52)

  • OK, ich habe jetzt das Script etwas umgebaut

    Neues Script

    Hier die ersten 40 Zeilen meiner error.log wo ich die Variable $line3[0] reinschreibe

    40 Zeilen aus error.log

    A550014075 / Erzeuger

    A590007106 / Erzeuger

    A59S008096 / Entsorger

    A59T000805 / Beförderer

    B94103F005 / Erzeuger

    BERZ002145 / Erzeuger

    C000236909 / Beförderer

    C000417101 / Beförderer

    C000483073 / Beförderer

    C1E0000006 / Entsorger

    C1Q0000002 / Entsorger

    C4J8000009 / kurzfr.Lag./Umschlag

    CBEV001451 / Bevollmächtigter des Erzeugers

    CBEV001488 / Bevollmächtigter des Erzeugers

    CBM9410003 / Erzeuger

    CE00025793 / Erzeuger

    CE00026806 / Erzeuger

    CE00027044 / Erzeuger

    CE00027687 / Erzeuger

    CE00027737 / Erzeuger

    CS00002250 / Erzeuger

    CUX0001507 / Erzeuger

    E113T01176 / Beförderer

    E124808334 / Beförderer

    E151800206 / Beförderer

    E151M00542 / Makler

    E154021174 / Erzeuger

    E313E00015 / Erzeuger

    E366212040 / Erzeuger

    E374613806 / Erzeuger

    E515238071 / Erzeuger

    E515571808 / Entsorger

    E554205622 / Erzeuger

    E558056115 / Erzeuger

    E566B00014 / Bevollmächtigter des Erzeugers

    E711241957 / Erzeuger

    E711722708 / Entsorger

    E754A50063 / Entsorger

    E758040898 / Erzeuger

    F02E915901 / Erzeuger

    hier dann das Ergebnis aus der Textdatei, welche aus der komplilierten x64 EXE stammt

    hier die 40 Zeilen aus der "kompilierten" Textdatei

    A550014075 / ERZ

    A590007106 / ERZ

    A59S008096 / ENT

    A59S008096 / ENT

    B94103F005 / ERZ

    BERZ002145 / ERZ

    BERZ002145 / ERZ

    BERZ002145 / ERZ

    BERZ002145 / ERZ

    C1E0000006 / ENT

    C1Q0000002 / ENT

    C4J8000009 / ZWL

    CBEV001451 / Bevollmächtigter des ERZs

    CBEV001488 / Bevollmächtigter des ERZs

    CBM9410003 / ERZ

    CE00025793 / ERZ

    CE00026806 / ERZ

    CE00027044 / ERZ

    CE00027687 / ERZ

    CE00027737 / ERZ

    CS00002250 / ERZ

    CUX0001507 / ERZ

    CUX0001507 / ERZ

    CUX0001507 / ERZ

    CUX0001507 / ERZ

    E151M00542 / MAK

    E154021174 / ERZ

    E313E00015 / ERZ

    E366212040 / ERZ

    E374613806 / ERZ

    E515238071 / ERZ

    E515571808 / ENT

    E554205622 / ERZ

    E558056115 / ERZ

    E566B00014 / Bevollmächtigter des ERZs

    E711241957 / ERZ

    E711722708 / ENT

    E754A50063 / ENT

    E758040898 / ERZ

    F02E915901 / ERZ

    und zum Schluss noch das Ergebnis, wenn ich das Script via F5 laufen lasse

    40 Zeilen Text, wenn via F5 die Datei generiert wurde

    A550014075 / ERZ

    A590007106 / ERZ

    A59S008096 / ENT

    A59T000805 / BEF

    B94103F005 / ERZ

    BERZ002145 / ERZ

    C000236909 / BEF

    C000417101 / BEF

    C000483073 / BEF

    C1E0000006 / ENT

    C1Q0000002 / ENT

    C4J8000009 / ZWL

    CBEV001451 / BEV

    CBEV001488 / BEV

    CBM9410003 / ERZ

    CE00025793 / ERZ

    CE00026806 / ERZ

    CE00027044 / ERZ

    CE00027687 / ERZ

    CE00027737 / ERZ

    CS00002250 / ERZ

    CUX0001507 / ERZ

    E113T01176 / BEF

    E124808334 / BEF

    E151800206 / BEF

    E151M00542 / MAK

    E154021174 / ERZ

    E313E00015 / ERZ

    E366212040 / ERZ

    E374613806 / ERZ

    E515238071 / ERZ

    E515571808 / ENT

    E554205622 / ERZ

    E558056115 / ERZ

    E566B00014 / BEV

    E711241957 / ERZ

    E711722708 / ENT

    E754A50063 / ENT

    E758040898 / ERZ

    F02E915901 / ERZ

    Könnte es sein, das ich bei

    Code
    Case StringInStr($line3[0], "Bevollmächtigter des Erzeugers")
                    Local $sString = StringReplace($line3[0], "Bevollmächtigter des Erzeugers", "BEV")

    die Leerzeichen zwischen "Bevollmächtigter des Erzeugers" irgendwie "anders" schreiben muss?

    Wo liegt denn der Unterschied (das ist eine Verständnisfrage für mich) zwischen dem rohen Script und dem kompilierten Script

  • Das macht in AutoIt absolut keinen Unterschied da beide Zeichen gültige Stringliterale darstellen.

    Grundsätzlich ja, im Zusammenhang mit Umlauten hat mir dies dennoch schon mal geholfen, weshalb ich selber mittlerweile fast ausschließlich ' nutze.

    Habe meinen Beitrag aber bereits kurz vorher angepasst, da ich denke, das das Problem eher in der casesensitive liegen könnte.