StringRegExp(), Häufigkeit der RegEx-Treffer in einer Datei, zeilenweise bestimmen.

  • Guten Morgen Community,

    folgendes Problem stellt sich mir seit gestern. Ich möchte zeilenweise aus einer Datei die Anzahl der gefundenen RegEx-Treffer erhalten. Damit ich weiß, wie oft ich eine/mehrere entsprechende Schleife(n) laufen lassen muss etc.

    Hintergrund dazu:
    Ich exportiere Datensätze aus einer MS SQL Server DB. Diesen Export bekomme ich (fast) in dem Format (als Datei) ausgegeben, wie ich ihn benötige. Jedoch, um den Import in bspw. DB2 oder Oracle erreichen zu können, muss ich die Datumswerte in ihrer Form / Schreibweise ändern, da die Datentypen entsprechend verschieden sind - ansonsten bekomme ich die Daten nicht in die Datenbanken.

    Bspw.:
    "2013-01-10 00:00:00.000" zu "10.01.2013" oder oder oder, je nach Bedarf.

    Hier mal ein Ausschnitt (zensiert):

    Spoiler anzeigen
    [autoit]


    ; 301000000070000005^309500117^1301^100177504^002592193300^50001^2^Nachname^Name1^1942-04-11 00:00:00.000^2^10787^003^W01^^1306^71^70^-1^^0^^2013-01-10 00:00:00.000^2013-09-01 00:00:00.000^751227401^72^1^2^10787^309517036^0^10787^17171^1000^0^-2900^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^1886141120^500^0^^1800-01-01 00:00:00.000^0^0^0^01200113^^0^0^Text^^628846864^4^0^0^0^^^^^0^1800-01-01 00:00:00.000^0^^^^0^0^723208500^0^0^0^^0^^L245155046^2211^^100975500^
    ; 301000000081430411^591430411^1301^100975500^005745916602^30009^2^Nachname^Name2^1995-07-22 00:00:00.000^1^06369^X13^W01^^1306^18^17^-1^^0^^2013-01-10 00:00:00.000^2013-01-10 00:00:00.000^937078923^96^23^2^04289^591430411^0^04289^9044000^0^0^0^0^0^0^0^0^0^0^0^1^0^0^0^0^0^1^0^0^2602326946^300^0^^1800-01-01 00:00:00.000^0^0^0^5130106^^0^0^^^904103775259^0^0^0^0^^^^^0^1800-01-01 00:00:00.000^0^^^^0^0^962602600^0^0^0^^0^^X707941439^0^^^
    ; 301000000090000031^304208930^1301^101775500^002153095100^50001^2^Nachname^Name3^1941-12-14 00:00:00.000^2^26382^201^G03^^1403^72^71^-1^^0^^2013-01-02 00:00:00.000^2013-01-03 00:00:00.000^201023301^16^1^2^26384^302800843^0^26382^4905^0^350^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^2919209661^500^0^^1800-01-01 00:00:00.000^0^0^0^01020113^^0^0^^^100183611896^0^0^0^0^^^^^0^1800-01-01 00:00:00.000^0^^^^0^0^160114500^0^0^0^^0^^0^0^^100975500^

    [/autoit]


    Hinweis:
    Der Zeilenanfang ist KEIN ";" beim Originalexport (dient nur zum zeigen in geordneter Form).

    Datumswerte in Form von bspw. "2013-01-10 00:00:00.000" sind hierbei 5x auf einer Zeile vorhanden. Nun zu StringRegExp() - dies gibt mir den ersten Treffer bspw. in ein Array zurück, jedoch möchte ich alle Treffer einer Zeile im Array haben um später die Datumswerte entsprechend anzupassen und dann zu ersetzen. Insgesamt sind es also 15 Treffer in 3 Zeilen.

    Aktuelles Vorgehen:
    - Datei zeilenweise einlesen
    - Treffer in Array zwischenspeichern
    - manuell mit _StringBetween(), StringLen() usw. einen String zurecht basteln, dass ich ein Offset für StringRegEx() setzen kann
    - StringRegEx erneut ausführen um Treffer 2 einzulesen (wieder ins Array)
    - das Gleiche wie oben nochmals ... N x ... um 5 Treffer einzufangen und sinnvoll geordnet ins Array zu packen

    Geht soweit erstmal, jedoch habe ich auch Exportdateien, in den 8x oder 9x pro Zeile das Pattern zutrifft. Sollte doch irgendwie eleganter gehen dies sinnvoll zu lösen. Oder kennt jemand sogar eine Methode, um gefundene RegEx-Treffer - per RegEx zu verschieben? Also ich denke da an "2014-01-01" zu "01.01.2014" nur viel schneller als meine Variante.

    Wobei ich mir am Ende (falls mir hier jemand auf die Sprünge helfen kann) noch um das Ersetzen an den richtigen Stellen kümmern muss.
    Ich bitte um Ideen, Unterstützung, Denkanstöße und Hinweise.

    Habt alle vielen Dank und einen angenehmen Tag noch.

    UserIsGrateful 【ツ】

    4 Mal editiert, zuletzt von Sven-Seyfert (4. April 2014 um 16:21)

  • Moin!

    Es muss garnicht so kompliziert sein!
    Mit StringRegExpReplace kannst du das Datumsformat direkt ändern.
    (siehe StringRegExpReplace Konsolen Ausgabe im Beispiel)

    [...]Nun zu StringRegExp() - dies gibt mir den ersten Treffer bspw. in ein Array zurück, jedoch möchte ich alle Treffer einer Zeile im Array haben[...]


    Das stimmt nicht! Setzt man das Flag in StringRegExp auf 3, werden alle Treffer im Array gespeichert.
    (siehe StringRegExp im Beispiel)

    Beispiel:

    [autoit]

    #include <Array.au3>

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

    $sTestDB = "301000000070000005^309500117^1301^100177504^002592193300^50001^2^Nachname^Name1^1942-04-11 00:00:00.000^2^10787^003^W01^^1306^71^70^-1^^0^^2013-01-10 00:00:00.000^2013-09-01 00:00:00.000^751227401^72^1^2^10787^309517036^0^10787^17171^1000^0^-2900^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^1886141120^500^0^^1800-01-01 00:00:00.000^0^0^0^01200113^^0^0^Text^^628846864^4^0^0^0^^^^^0^1800-01-01 00:00:00.000^0^^^^0^0^723208500^0^0^0^^0^^L245155046^2211^^100975500^" & @CRLF & _
    "301000000081430411^591430411^1301^100975500^005745916602^30009^2^Nachname^Name2^1995-07-22 00:00:00.000^1^06369^X13^W01^^1306^18^17^-1^^0^^2013-01-10 00:00:00.000^2013-01-10 00:00:00.000^937078923^96^23^2^04289^591430411^0^04289^9044000^0^0^0^0^0^0^0^0^0^0^0^1^0^0^0^0^0^1^0^0^2602326946^300^0^^1800-01-01 00:00:00.000^0^0^0^5130106^^0^0^^^904103775259^0^0^0^0^^^^^0^1800-01-01 00:00:00.000^0^^^^0^0^962602600^0^0^0^^0^^X707941439^0^^^" & @CRLF & _
    "301000000090000031^304208930^1301^101775500^002153095100^50001^2^Nachname^Name3^1941-12-14 00:00:00.000^2^26382^201^G03^^1403^72^71^-1^^0^^2013-01-02 00:00:00.000^2013-01-03 00:00:00.000^201023301^16^1^2^26384^302800843^0^26382^4905^0^350^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^2919209661^500^0^^1800-01-01 00:00:00.000^0^0^0^01020113^^0^0^^^100183611896^0^0^0^0^^^^^0^1800-01-01 00:00:00.000^0^^^^0^0^160114500^0^0^0^^0^^0^0^^100975500^"

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

    ;~ $sTestDB = ClipGet() ;==> falls die Daten in der Zwischenablage sind

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

    ;==> Daten "verwurschteln"
    $sResult = StringRegExpReplace($sTestDB, '\^(\d{4})-(\d{2})-(\d{2}) ', '\^$3.$2.$1 ')
    ;==> $sResult enthält jetzt das gewünschte Datumsformat. Siehe Konsole...
    ConsoleWrite($sResult)

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

    ;==> Daten in Array speichern
    $aResult = StringRegExp($sResult, '\^(\d{2}\.\d{2}\.\d{4}) ', 3)

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

    _ArrayDisplay($aResult)

    [/autoit]


    Sanfte Grüße :D

  • Vielleicht habe ich es falsch verstanden aber würde dir auch ein StringRegExpReplace reichen?:

    [autoit]

    Global $s_Text = "301000000070000005^309500117^1301^100177504^002592193300^50001^2^Nachname^Name1^1942-04-11 00:00:00.000^2^10787^003^W01^^1306^71^70^-1^^0^^2013-01-10 00:00:00.000^2013-09-01 00:00:00.000^751227401^72^1^2^10787^309517036^0^10787^17171^1000^0^-2900^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^1886141120^500^0^^1800-01-01 00:00:00.000^0^0^0^01200113^^0^0^Text^^628846864^4^0^0^0^^^^^0^1800-01-01 00:00:00.000^0^^^^0^0^723208500^0^0^0^^0^^L245155046^2211^^100975500^" & @CRLF & _
    "301000000081430411^591430411^1301^100975500^005745916602^30009^2^Nachname^Name2^1995-07-22 00:00:00.000^1^06369^X13^W01^^1306^18^17^-1^^0^^2013-01-10 00:00:00.000^2013-01-10 00:00:00.000^937078923^96^23^2^04289^591430411^0^04289^9044000^0^0^0^0^0^0^0^0^0^0^0^1^0^0^0^0^0^1^0^0^2602326946^300^0^^1800-01-01 00:00:00.000^0^0^0^5130106^^0^0^^^904103775259^0^0^0^0^^^^^0^1800-01-01 00:00:00.000^0^^^^0^0^962602600^0^0^0^^0^^X707941439^0^^^" & @CRLF & _
    "301000000090000031^304208930^1301^101775500^002153095100^50001^2^Nachname^Name3^1941-12-14 00:00:00.000^2^26382^201^G03^^1403^72^71^-1^^0^^2013-01-02 00:00:00.000^2013-01-03 00:00:00.000^201023301^16^1^2^26384^302800843^0^26382^4905^0^350^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^0^2919209661^500^0^^1800-01-01 00:00:00.000^0^0^0^01020113^^0^0^^^100183611896^0^0^0^0^^^^^0^1800-01-01 00:00:00.000^0^^^^0^0^160114500^0^0^0^^0^^0^0^^100975500^"

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

    ; RegEx-Pattern um Datum/Zeit der Form yy-mm-dd HH-MM-SS.sss zu matchen:
    Global $s_Pattern = "(?x)" & @CRLF & _
    "\b((?:19|20)\d{2})- # Jahr" & @CRLF & _
    "(0[1-9]|1[012])- # Monat" & @CRLF & _
    "(0[1-9]|[12]\d|3[01])\b # Tag" & @CRLF & _
    "[ ]" & @CRLF & _
    "\b([01]\d|2[0-3]): # Stunden" & @CRLF & _
    "([0-5]\d): # Minuten" & @CRLF & _
    "([0-5]\d)\. # Sekunden" & @CRLF & _
    "(\d{3})\b # Millisekunden"

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

    ConsoleWrite("--- Vorher ----" & @CRLF & $s_Text & @CRLF & @CRLF)

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

    Global $s_TextNeu = StringRegExpReplace($s_Text, $s_Pattern, "$3.$2.$1")

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

    ConsoleWrite("---Nachher ----" & @CRLF & $s_TextNeu)

    [/autoit]

    edit: zu spät

    2 Mal editiert, zuletzt von AspirinJunkie (3. April 2014 um 08:56)

  • Hallo und vielen, vielen Dank Friesel und AspirinJunkie.

    Was soll ich viel mehr sagen, es funktioniert sowohl die eine, als auch die andere Variante (die ja sehr ähnlich sind). TOP! Die Ersetzung / Verschiebung per "$3.$2.$1" kannte ich einfach nicht - somit geht es super easy von der Hand.

    Der Thread wird als gelöst markiert, danke nochmals - angenehmen Tag weiterhin.

    UserIsGrateful 【ツ】

    2 Mal editiert, zuletzt von Sven-Seyfert (4. April 2014 um 16:19)