.TXT einlesen, bestimmten Nummernkreis prüfen und ggf. ersetzen

  • Hallo zusammen,

    ich schreibe gerade ein kleines Script, das eine .txt Datei einliest und diese ausgibt.

    Das knifflige ist allerdings, dass ich eine Inputbox habe wo ich "von" und "bis" eingebe.

    Beim betätigen eines bestimmten Buttons, soll das Script prüfen, ob dieser Nummernkreis (von-bis) in der eingelesenen Datei
    bereits vorhanden ist und wenn nicht, soll dieser Kreis erweitert werden.

    Und genau bei dieser Prüfung hänge ich gerade fest. Hat jemand vielleicht einen Ansatz bzw. einen Codeschnippsel, der mir weiterhilft?

    Weitere Fragen zum Zweck/Sinn des Scripts werde ich selbstverständlich bei Bedarf beantworten [Blockierte Grafik: http://www.codebot.de/wcf/images/smilies/smile.png]

    Anbei auch ein Teil meines bereits geschriebenen Codes:


    [autoit]


    GuiCreate("GUI",550,600,-1,-1)
    GUICtrlCreateLabel("Von", 180, 30)
    GUICtrlCreateLabel("98110", 115, 64)
    GUICtrlCreateLabel("+PZ", 233, 64)
    GUICtrlCreateLabel("Bis", 360, 30)
    GUICtrlCreateLabel("98110", 285, 64)
    GUICtrlCreateLabel("+PZ", 402, 64)

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

    $von = GUICtrlCreateInput("0000000",150,60,80,20,$ES_NUMBER)
    GUICtrlSetLimit(-1, 7)
    $bis = GUICtrlCreateInput("0000000",320,60,80,20,$ES_NUMBER)
    GUICtrlSetLimit(-1, 7)

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

    $erstellen=GuiCtrlCreateButton("Prüfen + Datei erstellen",175,500,200,50)
    GUISetState(@SW_SHOW)

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

    $Select = @DesktopDir & "\Einlesen.txt"
    $outpout = @DesktopDir & "\Schreiben.txt"
    $Open = FileOpen($Select, 0)
    $Read = FileRead($Select)

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

    $Select_Datei = GUICtrlCreateEdit($Read, 210, 100, 130, 300, $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_READONLY)

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $erstellen

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

    int($von)
    int($bis)
    $readvon = GUICtrlRead($von)
    $readbis = GUICtrlRead($bis)
    $vonlaenge = StringLen($readvon)
    $bislaenge = StringLen($readbis)
    If $vonlaenge < 7 Then
    Msgbox($MB_ICONERROR,"Eingabe zu kurz","Der eingegebene von-kreis ist zu kurz")
    ContinueCase
    ElseIf $bislaenge < 7 Then
    Msgbox($MB_ICONERROR,"Eingabe zu kurz","Der eingegebene bis-kreis ist zu kurz")
    ContinueCase
    EndIf

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

    ;MsgBox(0,"",$readvon)
    ;MsgBox(0,"",$readbis)

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

    $CountLines = _FileCountLines($Select)

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

    For $i = 1 to $CountLines Step 1
    $line = FileReadLine($Open)
    $array = StringSplit ( $line, "-")
    $Readarray1 = $array[1]
    $Readarray2 = $array[2]
    ;MsgBox(0,"",$Readarray1)
    ;MsgBox(0,"",$Readarray2)
    $hFileOpen = FileOpen($outpout, $FO_APPEND)

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

    FileWrite($hFileOpen, $line & @CRLF )
    FileClose($hFileOpen)
    Next

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

    FileClose($Open)

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

    EndSwitch
    WEnd

    [/autoit]

    Inhalt der Einlesen.txt:
    0000001-0023088
    0023099-0060700
    0060781-0194450
    0194501-0196390
    0196401-0196440
    0196451-0804964
    0804981-0804995
    0804998-0995250
    0995269-1050440

    Einmal editiert, zuletzt von ValleAIT (15. Dezember 2015 um 16:55)

  • Könntest DU mal die "Einlesen.txt" und wenn nötig auch die "Schreiben.txt" posten als gepackten Anhang?

    Vielen Dank.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

  • Vielleicht hilft Dir folgendes, das aber nur als Anschauungsobjekt mal dargestellt wird.

    Noch etwas gefunden, das weiter helfen könnte:

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

    Einmal editiert, zuletzt von Alina (15. Dezember 2015 um 17:16)

    • Offizieller Beitrag

    Hier mal ein kleiner Denkansatz zum Vereinzeln der Werte. Das andere ist ja dann nur ein simpler Vergleich, solltest du schaffen. Wenns Probleme gibt, frag nach.

  • Danke euch beiden für die Antwort.

    Also ich muss ehrlich sagen, dass ich noch nicht so lange mit AutoIT arbeite und das da oben etwas kryptisch für mich aussieht :) Allerdings bestimmt ein guter Ansatz, da es im Prinzip wirklich nur ein Vergleich ist.

    Der Vorgang sollte so sein:
    die Einlesen.txt lautet bspw.:

    0000001-0023088
    0023099-0060700
    0060781-0194450
    0194501-0196390
    0196401-0196440
    0196451-0804964
    0804981-0804995
    0804998-0995250
    0995269-1050440
    Würde ich jetzt in der Zeile "von" den Wert 0020000 eingeben und bei "bis" den Wert 0021000, dann soll das Script erkennen, dass die beiden Werte innerhalb der Range der ersten Zeile des Einlesen.txt ist und das Script muss nichts anpassen.

    Würde ich in der Zeile "von" den Wert 0023090 eingeben und bei "bis" den Wert 0023095, dann soll das Script erkennen, das die beiden Werten außerhalb der Range liegt und dann sollen die beiden Werte eingefügt und als Ausgabe.txt speichern.
    Das würde dann folgendermaßen aussehen:
    Ausgabe.txt:

    0000001-0023088
    0023090-0023095
    0023099-0060700
    0060781-0194450
    0194501-0196390
    0196401-0196440
    0196451-0804964
    0804981-0804995
    0804998-0995250
    0995269-1050440


    Meine Idee wäre es mit mathematischen Vorgängen zu lösen(?): Das Script geht jede zeile durch und wenn die Summe negativ ist, dann soll das Script die Werte einfügen und abspeichern.

    Entweder ich stelle mich gerade an oder bin zu doof dafür :(

    • Offizieller Beitrag
  • Ja, sowas habe ich gesucht! Vielen Dank dafür!

    Können wir vielleicht das ganze noch verfeinern? Wie oben erwähnt, ich habe noch nicht wirklich viel Erfahrung mit AutoIT und so einen Code wie du ihn geschickt hast, wäre ich vermutlich nicht gekommen.

    Ich wäre sehr dankbar, wenn wir das irgendwie hinbekommen könnten :)

    EDIT:

    Habe nun etwas rumprobiert, allerdings kriege ich es nicht hin, das die Ausgabe.txt den fehlenden Nummernkreis an der richtigen Stelle einfügt. Hier der Code:

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

    ...

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

    int($von)
    int($bis)
    $readvon = GUICtrlRead($von)
    $readbis = GUICtrlRead($bis)
    $vonlaenge = StringLen($readvon)
    $bislaenge = StringLen($readbis)

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

    If $readvon > $readbis Then
    msgbox($MB_ICONERROR,"Fehler", "Der von-Wert darf nicht größer, als der bis-Wert sein!")
    ContinueLoop
    EndIf

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

    If $readvon = $readbis Then
    msgbox($MB_ICONERROR,"Fehler", "Der von-Wert darf nicht identisch mit dem bis-Wert sein!")
    ContinueLoop
    EndIf

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

    If $vonlaenge < 7 Then
    Msgbox($MB_ICONERROR,"Eingabe zu kurz","Der eingegebene von-Gutscheinkreis ist zu kurz")
    ContinueLoop
    ;~ ContinueCase
    ElseIf $bislaenge < 7 Then
    Msgbox($MB_ICONERROR,"Eingabe zu kurz","Der eingegebene bis-Gutscheinkreis ist zu kurz")
    ContinueLoop
    ;~ ContinueCase
    EndIf

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

    ;Hier kommt die Prüfung, ob die Range bereits eingetragen ist

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

    GUICtrlSetState($pruefen, $GUI_DISABLE)
    GUICtrlSetState($erstellen, $GUI_ENABLE)

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

    Case $erstellen
    MsgBox(0,"",$readvon)
    MsgBox(0,"",$readbis)

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

    $CountLines = _FileCountLines($Select)

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

    For $i = 1 to $CountLines Step 1
    $line = FileReadLine($Open)
    $array = StringSplit ( $line, "-")
    $Readarray1 = $array[1]
    $Readarray2 = $array[2]
    ;~ MsgBox(0,"",$Readarray1)
    ;~ MsgBox(0,"",$Readarray2)
    $hFileOpen = FileOpen($outpout, $FO_APPEND)

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

    $inputVon = $readvon
    $inputBis = $readbis

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

    $sFile = _
    $Readarray1&"-"&$Readarray2 & @CRLF & _
    $Readarray1&"-"&$Readarray2 & @CRLF

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

    $aNummernkreise = StringRegExp($sFile, '(\d{7})-(\d{7})', 3)

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

    $sRange = ''
    Local $iVon, $iBis

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

    For $i = 0 To UBound($aNummernkreise) -1 Step 2
    $iVon = Int($aNummernkreise[$i])
    $iBis = Int($aNummernkreise[$i+1])
    If $iVon <= Int($inputVon) And $iBis >= Int($inputBis) Then
    $sRange = StringFormat('%s-%s', $aNummernkreise[$i], $aNummernkreise[$i+1])
    ExitLoop
    EndIf
    Next

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

    ;~ msgbox(0,"",$sRange)

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

    If $sRange <> '' Then
    ConsoleWrite('Bereich existiert in: ' & $sRange & @CRLF)
    FileWrite($hFileOpen,$iVon & "-" & $iBis & @CRLF )
    MsgBox(0, "","Weiter suchen")
    Else
    ConsoleWrite('Bereich noch nicht vorhanden.' & @CRLF)
    FileWrite($hFileOpen,$inputVon & "-" & $inputBis & @CRLF )
    MsgBox(0, "","Geschrieben")
    EndIf

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

    ;~ $line = StringReplace($line, "ZZZ", $ZZZ)
    ;~ $line = StringReplace($line, "XXX", $prozent)

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

    FileWrite($hFileOpen, $line & @CRLF )
    FileClose($hFileOpen)
    Next

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

    FileClose($Open)

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

    EndSwitch
    WEnd

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


    Gebe ich bei "von"="0194460" ein und bei "bis"="0194470" sieht die Ausgabe.txt sieht dann so aus:

    0194460-0194470
    0000001-0023088
    0194460-0194470
    0023099-0060700
    0194460-0194470
    0060781-0194450
    0194460-0194470
    0194501-0196390
    0194460-0194470
    0196401-0196440
    0194460-0194470

    Die beiden eingegebenen Werte werden also in jede zweite Zeile im Wechsel geschrieben :( Zudem werden dei beiden ConsoleWrite-Befehle auch nicht richtig gesetzt.

    2 Mal editiert, zuletzt von ValleAIT (18. Dezember 2015 um 12:02)