Suchen & Ersetzen

  • Ich habe eine Source Datei die kunden.txt heißt.
    Dort gibt es pro Kundennr. eine weitere Kundennr., mit einem Semikolon getrennt also:

    Code
    Kundennr.1;Kundennr.2
    11;1212
    123;145156


    In einer zweiten TXT (import.txt) sind Warenwirtschaftsdaten

    Code
    Kundennr.1;Text;Zahl
    11;zashkajchkjef;550987,12
    123;zf;7,22
    11;zashkajchkjef;12131,12

    Jetzt soll jeder Wert in der import.txt sämtliche Kundennr.1 in Kundennr.2 ersetzt werden, also 11 in 1212.

    Die Kundennr. sind vorlaufende Zahlen von 1 beginnend, also gibt es Kunde 1, 11, 111, 1111 usw.

    Das hab ich schon:

    [autoit]


    $Content1=FileRead("kunden.txt")
    $Content2=FileRead("import.txt")
    $nummern=StringSplit($Content1,";")
    $ersteNummer=$nummern[1]
    $zweiteNummer=$nummern[2]
    $Content2=StringReplace($Content2,$ersteNummer,$zweiteNummer)
    FileWrite("aufbereitet.txt",$Content2)

    [/autoit]

    Das alles soll dann als neue Datei gespeichert werden. Jemand eine Idee um das mit AutoIT zu machen?

    Danke im vorraus.

    4 Mal editiert, zuletzt von ZoeLeah (18. Mai 2010 um 11:48)

  • quick & dirty:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    Dim $kunden
    _FileReadToArray("kunden.txt", $kunden)
    $import=FileRead("import.txt")
    for $i = 1 To $kunden[0]
    $tmp = StringSplit($kunden[$i], ";")
    $import = StringReplace($import, $tmp[1], $tmp[2])
    Next
    FileWrite("Ergebnis.txt", $import)

    [/autoit]
  • Hab mich mal dem Beispiel von Schnitzel angeschlossen.
    Hier eine Version mit StringRegExp.

    [autoit]

    $sDateiMitKundenNummern = _
    "Kundennr.1;Kundennr.2" & @CRLF & _
    "11;1212" & @CRLF & _
    "123;145156" & @CRLF
    $sZielDatei = _
    "Kundennr.1;Text;Zahl" & @CRLF & _
    "11;zashkajchkjef;550987,12" & @CRLF & _
    "123;zf;7,22" & @CRLF & _
    "11;zashkajchkjef;12131,12" & @CRLF

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

    Local $sDateiMitKundenNummern = FileRead("kunden.txt"), $sZielDatei = FileRead("import.txt")
    $aKundennummern = StringRegExp($sDateiMitKundenNummern, "(?<=^|"&@CRLF&")(\d+);(\d+)", 3)
    If Not @error Then
    For $i = 0 To UBound($aKundennummern) - 1 Step 2
    $sZielDatei = StringRegExpReplace($sZielDatei, "(?<=^|"&@CRLF&")(" & $aKundennummern[$i] & ")(?=;)", "_" & $aKundennummern[$i + 1])
    Next
    $sZielDatei = StringRegExpReplace($sZielDatei, "(?<=^|"&@CRLF&")_(?=\d)", "")
    EndIf
    MsgBox(0,"",$sZielDatei)

    [/autoit]
  • Der Sachverhalt hat sich ein wenig verändert.

    Kundendaten.csv enthält 2 Spalten:

    Code
    Kundennr.1;Kundennr.2

    WaWi.csv folgende Spalten:

    Code
    EUR;H000000191,80;00;000000000;549794      ;            ;29012010;000725050;        ;        ;00000000000;0000000000;Soll                          ;

    Jetzt darf nur der Bereich 000725050 abgeändert werden, ABER !!!! nur Daten die mit 0007 oder 0008 oder 0009 beginnen.

    000725050 = Kundennr. 2 und muss durch Kundennr. 1 ersetzt werden.
    WaWi.csv enthält mehrere Zeilen.

    Falls Kundennr. 2 nicht in Kundendaten.csv enthalten ist, muss ein Error-%Datum%.log erstellt werden und eine Errormeldung erscheinen. Das weitere Verarbeiten darf nicht fortgeführt werden.

    Die neue Datei soll Aufbereitet.csv heißen.

    Vorhandene Aufbereitet.csv Dateien sollen erst nach Bestätigungen überschrieben werden.
    Ich bin leider vollkommen unfähig in der Programmierung, wäre fein eine Fertige Lösung von euch zu bekommen.

    Danke im voraus.

  • Als Dank dafür, dass du präsize alle Informationen lieferst die man braucht (ohne dass ich nachfragen musste) , hier dein Script :P

    Spoiler anzeigen
    [autoit]

    $sKundendaten = FileRead(@ScriptDir & "\Kundendaten.csv")
    $sWaWi = FileRead(@ScriptDir & "\WaWi.csv")

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

    $aKNum2 = StringRegExp($sWaWi, "(?<=;)0{3}[789]\d+", 3)
    If @error Then
    MsgBox(0, "", "Keine passenden nummern gefunden. Fehlercode " & @error)
    _ErrorLog("Keine passenden Kundennummern gefunden, Beende.")
    Exit
    EndIf

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

    For $i = 0 To UBound($aKNum2) - 1
    $aKNum1 = StringRegExp($sKundendaten, "(\d+)(?=;" & $aKNum2[$i] & ")", 3)
    If Not @error Then
    $sWaWi = StringRegExpReplace($sWaWi, "(?<=;)" & $aKNum2[$i] & "(?=;)", $aKNum1[0])
    Else
    While 1
    MsgBox(16, "ACHTUNG!", "Bitte geben Sie die Kundennummer 1 für " & $aKNum2[$i] & " ein!")
    _ErrorLog("Keine Kundennummer 1 gefunden für " & $aKNum2[$i])
    $vInput = InputBox("", "")
    If @error Then
    _ErrorLog("Abbruch durch Benutzer")
    Exit
    EndIf
    Switch MsgBox(3, "", $aKNum2[$i] & " wird nun durch " & $vInput & " überschrieben." & @CRLF & "Sind Sie sicher?")
    Case 2 ; Cancel
    _ErrorLog("Abbruch durch Benutzer")
    Exit
    Case 6 ; Yes
    ExitLoop
    EndSwitch
    WEnd
    _ErrorLog($aKNum2[$i] & " wird nun durch " & $vInput & " überschrieben.")
    $sWaWi = StringRegExpReplace($sWaWi, "(?<=;)" & $aKNum2[$i] & "(?=;)", $vInput)
    EndIf
    Next

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

    If FileExists(@ScriptDir & "\Aufbereitet.csv") Then
    _ErrorLog("Aufbereitet.csv existiert bereits")
    If MsgBox(4, "Datei ersetzen", "Vorhandene Aufbereitet.csv überschreiben?") = 6 Then
    _ErrorLog("Datei überschreiben...")
    FileDelete(@ScriptDir & "\Aufbereitet.csv")
    Else
    _ErrorLog("Abbruch durch Benutzer")
    Exit
    EndIf
    EndIf
    FileWrite(@ScriptDir & "\Aufbereitet.csv", $sWaWi)

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

    Func _ErrorLog($sText)
    FileWrite(@ScriptDir & "\error.log", @MDAY & "." & @MON & "." & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & "=====> " & $sText & @CRLF)
    EndFunc ;==>_ErrorLog

    [/autoit]
  • Hallo SEuBo,

    danke für dein Script.

    Was es nicht macht:
    Die Kundennr. in der WaWi.csv ist gleich Kundennr. 2 in der Kundendaten.csv, wenn diese nicht vorhanden ist, muss das Error Log erstellt werden.
    Fall die Kundennr. 2 in WaWi.csv und Kundendaten.csv vorhanden ist, soll es automatisch durch die Kundennr. 1 ersetzt werden.

    Nur eine Fehlermeldung und Error-Log, falls die Kundennr. in der Wawi.csv nicht als Kundennr. 2 in der Kundendaten.csv vorhanden ist.

    Hab mich wohl "falsch" ausgedrückt.

    Einmal editiert, zuletzt von ZoeLeah (15. April 2010 um 09:55)

  • So in der Art soll es aussehen:

    [autoit]

    $sKundendaten = FileRead(@ScriptDir & "\Kundendaten.txt")
    $sWaWi = FileRead(@ScriptDir & "\datev.txt")

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

    $aKNum2 = StringRegExp($sWaWi, "(?<=;)0{3}[789]\d+", 3)

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

    ; Wenn $aKNum2 nicht vorhanden in $sKundendaten an Stelle 2 dann ERROR

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

    For $i = 0 To UBound($aKNum2) - 1
    $aKNum1 = StringRegExp($sKundendaten, "(\d+)(?=;" & $aKNum2[$i] & ")", 3)
    $sWaWi1 = StringRegExpReplace($sWaWi, "(?<=;)" & $aKNum2[$i] & "(?=;)", $aKNum1[0])
    Next

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

    If FileExists(@ScriptDir & "\Aufbereitet.txt") Then
    If MsgBox(4, "Datei ersetzen", "Vorhandene Aufbereitet.txt überschreiben?") = 6 Then
    FileDelete(@ScriptDir & "\Aufbereitet.txt")
    Else
    _ErrorLog("Datei nicht überschrieben.")
    Exit
    EndIf
    EndIf
    FileWrite(@ScriptDir & "\Aufbereitet.txt", $sWaWi1)
    MsgBox(262144, "Erfolgreich", "Konvertierung erfolgreich abgeschlossen")

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

    Func _ErrorLog($sText)
    FileWrite(@ScriptDir & "\error_" & @YEAR & "-" & @MON & "-" & @MDAY &".log", "=====> " & $sText & @CRLF)
    EndFunc ;==>_ErrorLog

    [/autoit]

    Nur klappt das mit:

    [autoit]

    For $i = 0 To UBound($aKNum2) - 1
    $aKNum1 = StringRegExp($sKundendaten, "(\d+)(?=;" & $aKNum2[$i] & ")", 3)
    $sWaWi1 = StringRegExpReplace($sWaWi, "(?<=;)" & $aKNum2[$i] & "(?=;)", $aKNum1[0])
    Next

    [/autoit]


    nicht so recht und mit dem Abfangen der Kundennr.2 aus Datev.txt (ehemals WaWi.csv) wenn sie nicht in Kundendaten.txt vorhanden ist an Stelle 2 hab ich auch Probleme.

    Danke im voraus für eure Hilfe

  • My fault. :S

    Ist das jetzt richtig?

    Liest alle Kundennummern aus der Wawi.csv. Danach wird jede Kundenummer (2) in der Kundendaten.csv gesucht.
    Findet das Script entweder keine Kundennummer 2 oder keine dazugehörige Kundennummer 1 in der Kundendaten.csv, dann
    wird eine Error-[datum].log erstellt. Danach wird das Script solange angehalten, bis die MsgBox() bestätigt wurde.
    Danach geht das Script zur nächsten Kundennummer 2 aus der Wawi.csv

    Spoiler anzeigen
    [autoit]

    #include <Date.au3>
    $sKundendaten = FileRead(@ScriptDir & "\Kundendaten.csv")
    $sWaWi = FileRead(@ScriptDir & "\WaWi.csv")

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

    $aKNum2 = StringRegExp($sWaWi, "(?<=;)0{3}[789]\d+", 3)
    If @error Then
    MsgBox(0, "", "Keine passenden Nummern gefunden. Fehlercode " & @error)
    Exit
    EndIf

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

    For $i = 0 To UBound($aKNum2) - 1
    $aKNum1 = StringRegExp($sKundendaten, "(\d+)(?=;" & $aKNum2[$i] & ")", 3)
    If Not @error Then
    $sWaWi = StringRegExpReplace($sWaWi, "(?<=;)" & $aKNum2[$i] & "(?=;)", $aKNum1[0])
    Else
    $iErrTime = _Now()
    _ErrorLog("(" & $iErrTime & ")" & @CRLF & $aKNum2[$i] & " wurde nicht in der Kundendaten.csv gefunden.")
    MsgBox(16, "ACHTUNG!", "(" & $iErrTime & ")" & @CRLF & $aKNum2[$i] & " wurde nicht in der Kundendaten.csv gefunden.")
    EndIf
    Next

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

    If FileExists(@ScriptDir & "\Aufbereitet.csv") Then
    If MsgBox(4, "Datei ersetzen", "Vorhandene Aufbereitet.csv überschreiben?") = 6 Then
    FileDelete(@ScriptDir & "\Aufbereitet.csv")
    Else
    Exit
    EndIf
    EndIf
    FileWrite(@ScriptDir & "\Aufbereitet.csv", $sWaWi)

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

    Func _ErrorLog($sText, $iTime = -1)
    If $iTime = -1 Then $iTime = _NowDate()
    FileWrite(@ScriptDir & "\Error-" & $iTime & ".log", "=====> " & $sText & @CRLF)
    EndFunc ;==>_ErrorLog

    [/autoit]
  • Kleine Änderung noch:

    Die MSG Ausgabe bei Fehler soll nur einmalig kommen, das Fehler aufgetaucht sind und das man ins Log schauen muss.
    Dabei muss aber sämtliche Auftretende Fehler ins Log geschrieben werden und dann aber das Script beendet werden und nicht die Aufbereitet.csv erstellt werden.

    Kannst du mir da nochmal weiter Helfen SEuBo :D

    [autoit]

    #include <Date.au3>
    $sKundendaten = FileRead(@ScriptDir & "\kunden.txt")
    $sWaWi = FileRead(@ScriptDir & "\datev.txt")

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

    $aKNum2 = StringRegExp($sWaWi, "(?<=;)0{3}[789]\d+", 3)
    If @error Then
    MsgBox(0, "", "Keine passenden Nummern gefunden. Fehlercode " & @error)
    Exit
    EndIf

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

    For $i = 0 To UBound($aKNum2) - 1
    $aKNum1 = StringRegExp($sKundendaten, "(\d+)(?=;" & $aKNum2[$i] & ")", 3)
    If Not @error Then
    $sWaWi = StringRegExpReplace($sWaWi, "(?<=;)" & $aKNum2[$i] & "(?=;)", $aKNum1[0])
    Else
    $iErrTime = _Now()
    _ErrorLog("(" & $iErrTime & ")" & @CRLF & $aKNum2[$i] & " wurde nicht in der kunden.txt gefunden.")
    EndIf
    Next

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

    If FileExists(@ScriptDir & "\Aufbereitet.csv") Then
    If MsgBox(4, "Datei ersetzen", "Vorhandene Aufbereitet.csv überschreiben?") = 6 Then
    FileDelete(@ScriptDir & "\Aufbereitet.csv")
    Else
    Exit
    EndIf
    EndIf
    FileWrite(@ScriptDir & "\Aufbereitet.csv", $sWaWi)

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

    Func _ErrorLog($sText, $iTime = -1)
    If $iTime = -1 Then $iTime = _NowDate()
    FileWrite(@ScriptDir & "\Error-" & $iTime & ".log", "=====> " & $sText & @CRLF)
    EndFunc ;==>_ErrorLog

    [/autoit]