Zeile 2 mit StringMid

  • nabend,

    habe da ein kleines Problem mit der Zeile 2 von 80 Dateien. Das einlesen in ein Array läuft. Bei StringMid mit statischem Text das geht auch. Nur wie ich genau in der Zeile 2 suchen kann ist mir unklar. Auch steht immer eine andere Zahl dort die ich in einer txt zur Kontrolle benötige.
    Beispiell
    so sieht die Zeile 2 immer aus.(EDIFACT-Datei)
    K;380;o2/402661239;9;20070109;20061201;20061231;3;402661239;40035812;80001266_2
    Sorry was vergessen
    StringMid("K;380;o2/402661239;9;20070109;20061201;", 10, 9)
    Danke für jeden Hinweis

    Taucher

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

    Einmal editiert, zuletzt von taucher_2006 (26. Januar 2007 um 20:52)

    • Offizieller Beitrag

    Zeile 2 ist auch die zweite Zeile des Array (Leerzeilen inklusive).
    Also: $txtZeile2 = Array[2]

    Was also möchtest du genau machen?

    Edit: Sry, Array hat ja in diesem Fall bei [0] die Anzahl

  • Sorry da habe ich beim ersten Beitrag etwas vergessen.
    Es sollte so sein

    StringMid("K;380;o2/402661239;9;20070109;20061201;", 10, 9)
    Gesucht wird diese Nummer 402661239 oder ähnliche
    So sieht der Anfang aus.
    S;o2 MOBILFUNK;80001266_2;20070108;1243
    K;380;o2/402661239;9;20070109;20061201;20061231;3;402661239;40035812;80001266_2;Keine Rechnung nach

    Taucher

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

    Einmal editiert, zuletzt von taucher_2006 (26. Januar 2007 um 20:58)

    • Offizieller Beitrag

    Hi,

    [autoit]

    #include<Array.au3>
    #include<String.au3>
    Global $string = "K;380;o2/402661239;9;20070109;20061201;20061231;3;402661239;40035812;800012"
    Global $found = StringRegExp($string, "/\d*", 3)
    _ArrayDisplay($found, "Deine Zahl")
    Global $found2 = _StringBetween($string, "/", ";")
    _ArrayDisplay($found2, "Deine Zahl")

    [/autoit]

    So long,

    Mega

  • hallo,

    @th.meger
    ich bekomme
    C:\Programme\AutoIt3\Include\StringMid1.au3(9,50) : ERROR: _StringBetween(): undefined function.
    Global $found2 = _StringBetween($string, "/", ";")
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    C:\Programme\AutoIt3\Include\StringMid1.au3 - 1 error(s), 0 warning(s)
    habe ich was vergessen?
    da es sich um rechnungsnummern handelt ändert sich diese zahl.
    was bewirkt der _stringbetween? habe in der hilfe nichts gefunden

    Taucher

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

  • hi,

    so zur hälfte habe konnte ich das problem lösen, neue version geholt geht. aber wie kann ich nun eine varibale damit bedienen, da ja in jeder zweiten zeile eine andere nummer steht?
    mein versuch geht schief. mit _filewritefromarry schreibe ich dann in eine datei?

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <date.au3>
    #include<array.au3>
    Opt("TrayIconDebug", 1) ;0=no info, 1=debug line info
    $flta = _FileListToArray("C:\GLI_Prod\12 2006\", "*.INH")
    Global $string = _FileListToArray("C:\GLI_Prod\12 2006\", "*.INH")
    Global $flta = _StringBetween($string,"/", ";")

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

    If Not IsArray($flta) Then Exit MsgBox(16, "", "Keine Inhouse Datei(en) gefunden.. EXIT!")
    For $i = 1 To $flta[0]
    Dim $aRecords
    If Not _FileReadToArray("C:\GLI_Prod\12 2006\"&$flta[$i],$aRecords) Then
    MsgBox(4096, "Error", " Fehler beim Einlesen der Datei Fehler:" & @error)
    Exit
    EndIf
    For $x = 1 To $aRecords[0]
    If StringInStr($aRecords[$x], "K;380") Then ; Eintrag ist vorhanden

    MsgBox(4096, "", "vorhanden bei datei: "&$flta[$i]& "" &$flta)
    ;_Rechnung()
    Sleep(1500)
    ExitLoop
    EndIf
    If StringInStr($aRecords[$x], "K;130") Then ; Eintrag ist vorhanden
    ;MsgBox(4096, "", "vorhanden bei datei: "&$flta[$i])
    ;_EVN()
    Sleep(1500)
    ExitLoop
    EndIf
    Next
    Next

    [/autoit]

    danke
    taucher

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

    • Offizieller Beitrag
    Zitat

    mit _filewritefromarry schreibe ich dann in eine datei?


    Ja, jeder Eintrag des Arrays wird in eine einzelne Zeile geschrieben.

    Ich hab mal einige Änderungen vorgenommen und entsprechend kommentiert.

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <date.au3>
    #include<array.au3>
    Opt("TrayIconDebug", 1) ;0=no info, 1=debug line info
    ;~ $frta = _FileListToArray("C:\GLI_Prod\12 2006\", "*.INH") überflüssig -> neue Deklaration in Zeile 7
    Global $string = _FileListToArray("C:\GLI_Prod\12 2006\", "*.INH") ; liest alle *.INH-Files in Array $string
    ;~ Global $frta = _StringBetween($string,"/", ";") ; selektiert aus DATEINAMEN !! -> da kann er nix finden
    Dim $match, $frta

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

    If Not IsArray($string) Then
    MsgBox(16, "", "Keine Inhouse Datei(en) gefunden.. EXIT!")
    Exit
    EndIf
    For $i = 1 To $string[0] ; Dateiliste abarbeiten
    If IsArray(_FileReadToArray("C:\GLI_Prod\12 2006\" & $string[$i], $frta)) Then ; einzelne Datei in Array lesen ($ftra)
    $match = _StringBetween($frta[2],"/", ";") ; Wert in Zeile 2 auslesen
    If StringInStr($frta[2], "K;380") Then ; Eintrag ist vorhanden
    MsgBox(4096, "", "vorhanden bei datei: "& $string[$i] & "" & $match[0])
    ;_Rechnung()
    Sleep(1500)
    ExitLoop ; dann wird Bearbeitung abgebrochen !!!
    ElseIf StringInStr($frta[2], "K;130") Then ; Eintrag ist vorhanden
    ;MsgBox(4096, "", "vorhanden bei datei: "&$frta[$i])
    ;_EVN()
    Sleep(1500)
    ExitLoop ; dann wird Bearbeitung abgebrochen !!!
    EndIf
    Else
    MsgBox(4096, "Error", " Fehler beim Einlesen der Datei: " &"C:\GLI_Prod\12 2006\" & $string[$i] & @LF & "Fehler: " & @error)
    ;~ Exit ; falsch -> dann wird Programm beendet, nächste Datei soll aber bearbeitet werden!
    EndIf
    Next

    [/autoit]
  • hi,

    dank aber er rauscht gleich durch bis zur letzen msgbox. er liest nichts in array ein.was kann das sein?

    das mit _filefromarray ist dann ja falsch wenn ich nur die selectierten nummern aus der zeile 2 haben möchte.

    taucher

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

    • Offizieller Beitrag

    So, hab deine Files mal nachgebaut ;) und dann getestet.
    Jetzt funzt es:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <date.au3>
    #include <array.au3>
    #include <string.au3>
    Opt("TrayIconDebug", 1) ;0=no info, 1=debug line info

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

    Dim $pfad = "C:\GLI_Prod\12 2006\"
    Dim $string = _FileListToArray($pfad, "*.INH") ; liest alle *.INH-Files in Array $string
    Dim $match, $frta

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

    If Not IsArray($string) Then
    MsgBox(16, "", "Keine Inhouse Datei(en) gefunden.. EXIT!")
    Exit
    EndIf

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

    For $i = 1 To $string[0] ; Dateiliste abarbeiten
    _FileReadToArray($pfad & $string[$i], $frta)
    If @error <> 0 Then
    MsgBox(4096, "Error", " Fehler beim Einlesen der Datei: " & $pfad & $string[$i] & @LF & "Fehler: " & @error)
    Else
    $match = _StringBetween($frta[2],"/", ";") ; Wert in Zeile 2 auslesen
    If StringInStr($frta[2], "K;380") Then ; Eintrag ist vorhanden
    MsgBox(4096, "", "vorhanden bei datei: "& $string[$i] & " " & $match[0])
    ;_Rechnung()
    Sleep(1500)
    ;~ ExitLoop ; dann wird Bearbeitung abgebrochen !!!
    ElseIf StringInStr($frta[2], "K;130") Then ; Eintrag ist vorhanden
    ;MsgBox(4096, "", "vorhanden bei datei: "&$frta[$i])
    ;_EVN()
    Sleep(1500)
    ;~ ExitLoop ; dann wird Bearbeitung abgebrochen !!!
    EndIf
    EndIf
    Next

    [/autoit]
  • Hi,

    hab nochmal ne Variante mit RegExp gemacht. Vielleicht ist für Dich ja was brauchbares dabei ;)

    [autoit]


    $search = FileFindFirstFile(@ScriptDir&"\*.edifact")
    While $search
    $filename = FileFindNextFile($search)
    If @error Then ExitLoop
    $line = FileReadLine($filename,2)
    $result = StringRegExp($line,'\d{9}',1)
    MsgBox(64,"",$result[0]&@CR)
    WEnd
    FileClose($search)

    [/autoit]
  • hi,

    ich musste nochmal das thema aufmachen, da ich noch eine frage zu _FileWriteFromArray habe. ich habe es eigebaut, aber es wird nur eine nummer eingetragen.
    so _FileWriteFromArray($pathMain, $match,1,0) ein eintrag
    _FileWriteFromArray($pathMain, $match[0],1,0) kein eintrag

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <date.au3>
    #include <array.au3>
    #include <string.au3>
    Opt("TrayIconDebug", 1) ;0=no info, 1=debug line info
    Global $pathMain = "C:\GLI_Prod\12 2006\" &@MDAY&"."&@MON &"."& @YEAR&".xls"
    Dim $pfad = "C:\GLI_Prod\12 2006\"
    Dim $string = _FileListToArray($pfad, "*.INH") ; liest alle *.INH-Files in Array $string
    Dim $match, $frta
    ;Dim $pathMain
    If Not IsArray($string) Then
    MsgBox(16, "", "Keine Inhouse Datei(en) gefunden.. EXIT!")
    Exit
    EndIf

    For $i = 1 To $string[0] ; Dateiliste abarbeiten
    _FileReadToArray($pfad & $string[$i], $frta)
    If @error <> 0 Then
    MsgBox(4096, "Error", " Fehler beim Einlesen der Datei: " & $pfad & $string[$i] & @LF & "Fehler: " & @error)
    Else
    $match = _StringBetween($frta[2],"/", ";") ; Wert in Zeile 2 auslesen
    ;_File()
    If StringInStr($frta[2], "K;380") Then ; Eintrag ist vorhanden
    MsgBox(4096, "", "vorhanden bei datei: "& $string[$i] & " " & $match[0],2)
    ;_Rechnung()
    _FileWriteFromArray($pathMain, $match,1,0)
    Sleep(1500)
    ;~ ExitLoop ; dann wird Bearbeitung abgebrochen !!!
    ElseIf StringInStr($frta[2], "K;130") Then ; Eintrag ist vorhanden
    ;MsgBox(4096, "", "vorhanden bei datei: "&$frta[$i])
    ;_EVN()
    Sleep(1500)
    ;~ ExitLoop ; dann wird Bearbeitung abgebrochen !!!
    EndIf
    EndIf
    Next

    [/autoit]

    wenn ich das thema über fileopen mache dann läuft es durch doch dann bekomme ich eine fehlermeldung

    C:\Programme\AutoIt3\Include\File.au3 (178) : ==> Unable to open file, the maximum number of open files has been exceeded.:
    $hFile = FileOpen($sFilePath, 0)

    Spoiler anzeigen
    [autoit]

    Func _File()
    FileOpen($pathMain,1)
    FileWriteLine($pathMain, $match[0] & @CRLF)
    FileClose($pathMain)
    EndFunc

    [/autoit]


    wie kann ich es besser regeln?

    taucher

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

    • Offizieller Beitrag
    [autoit]

    _FileWriteFromArray($pathMain, $match,1,1)

    [/autoit]

    (nur Eintrag 1) oder

    [autoit]

    _FileWriteFromArray($pathMain, $match,1,0)

    [/autoit]

    (gesamtes Array) ist in diesem Fall identisch, da nur ein Treffer.

    Aber - in jedem Schleifendurchlauf mit Treffer bewirkt dieser Befehl, dass "$pathMain" NEU geschrieben wird. Die alte Datei wird also überschrieben.
    Ich mach dir gleich mal 'ne Variante, die das löst. Kommt im Edit.

    EDIT:

    Spoiler anzeigen
    [autoit]

    For $i = 1 To $string[0] ; Dateiliste abarbeiten
    _FileReadToArray($pfad & $string[$i], $frta)
    If @error <> 0 Then
    MsgBox(4096, "Error", " Fehler beim Einlesen der Datei: " & $pfad & $string[$i] & @LF & "Fehler: " & @error)
    Else
    $match = _StringBetween($frta[2],"/", ";") ; Wert in Zeile 2 auslesen
    If Not @error Then
    If StringInStr($frta[2], "K;380") Then ; Eintrag ist vorhanden
    MsgBox(4096, "", "vorhanden bei datei: "& $string[$i] & " " & $match[0])
    ;_Rechnung()
    _ArrayAdd($arErgebnis, $match[0])
    Sleep(1500)
    ;~ ExitLoop ; dann wird Bearbeitung abgebrochen !!!
    ElseIf StringInStr($frta[2], "K;130") Then ; Eintrag ist vorhanden
    MsgBox(4096, "", "vorhanden bei datei: "& $string[$i] & " " & $match[0])
    ;_EVN()
    Sleep(1500)
    ;~ ExitLoop ; dann wird Bearbeitung abgebrochen !!!
    EndIf
    Else
    MsgBox(4096, "", "In Datei: "& $string[$i] & " ist Nummer nicht enthalten.")
    EndIf
    EndIf
    Next
    _FileWriteFromArray($pathMain, $arErgebnis,1)
    Exit

    [/autoit]
  • hi,

    es wird keine datei angelegt!?!?

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <date.au3>
    #include <array.au3>
    #include <string.au3>
    Opt("TrayIconDebug", 1) ;0=no info, 1=debug line info
    Global $pathMain = "C:\GLI_Prod\12 2006\" &@MDAY&"."&@MON &"."& @YEAR&".xls"
    Dim $pfad = "C:\GLI_Prod\12 2006\"
    Dim $string = _FileListToArray($pfad, "*.INH") ; liest alle *.INH-Files in Array $string
    Dim $match, $frta
    DIm $arErgebnis
    ;Dim $pathMain
    If Not IsArray($string) Then
    MsgBox(16, "", "Keine Inhouse Datei(en) gefunden.. EXIT!")
    Exit
    EndIf
    For $i = 1 To $string[0] ; Dateiliste abarbeiten
    _FileReadToArray($pfad & $string[$i], $frta)
    If @error <> 0 Then
    MsgBox(4096, "Error", " Fehler beim Einlesen der Datei: " & $pfad & $string[$i] & @LF & "Fehler: " & @error)
    Else
    $match = _StringBetween($frta[2],"/", ";") ; Wert in Zeile 2 auslesen
    If Not @error Then
    If StringInStr($frta[2], "K;380") Then ; Eintrag ist vorhanden
    MsgBox(4096, "", "vorhanden bei datei: "& $string[$i] & " " & $match[0],2)
    ;_Rechnung()
    _ArrayAdd($arErgebnis, $match[0])
    Sleep(1500)
    ;~ ExitLoop ; dann wird Bearbeitung abgebrochen !!!
    ElseIf StringInStr($frta[2], "K;130") Then ; Eintrag ist vorhanden
    MsgBox(4096, "", "vorhanden bei datei: "& $string[$i] & " " & $match[0],2)
    ;_EVN()
    Sleep(1500)
    ;~ ExitLoop ; dann wird Bearbeitung abgebrochen !!!
    EndIf
    Else
    MsgBox(4096, "", "In Datei: "& $string[$i] & " ist Nummer nicht enthalten.")
    EndIf
    EndIf
    Next
    _FileWriteFromArray($pathMain, $arErgebnis,1)
    Exit

    [/autoit]


    ich habe $arErgebnis auf dim gestellt.

    mache ich noch was falsch? oder bin ich blind

    taucher

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D