String durchsuchen

  • Hallo Leute,

    habe folgendes vor: Es soll eine Datei durchsucht werden und bestimmte Anzahl der Zeichen zurück gegeben werden, wie mach ich das am besten?

    [autoit]


    FileOpen("test3.txt", 0)
    FileRead("test3.txt")
    $fileread = FileRead("test3.txt")

    [/autoit]

    Vermute mal dass mein $Fileread nun ein String ist, die Funktion StringinStr kommt nicht in Frage da Sie nur prüft ob die Zeichenkette drin ist. Ich möchte jedoch die Anzahl der Zeichen raus finden.
    Habt ihr eine Idee?

    Lg

    Einmal editiert, zuletzt von Remax (23. November 2009 um 13:41)

  • wenn du die anzahl aller zeichen in dem Textfile haben willst würde das hier gehen:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    Global $file, $zeichen = 0
    _FileReadToArray(@ScriptDir & '\Test.TXT', $file)
    For $i = 1 To $file[0]
    $zeichen += StringLen($file[$i])
    Next
    MsgBox(0,'', $zeichen)

    [/autoit]


    Wenn du was anderes willst dann erklär bitte genauer was du willst ;)

  • Hi,

    hier ein Ansatz mit StringInstr:

    [autoit]

    $file = FileOpen("test3.txt", 0)
    $fileread = FileRead($file)
    FileClose ($file)
    $search = "i"
    $count = 0
    $pos = 1
    While 1
    If StringInStr ($fileread, $search, 0, 1, $pos) <> 0 Then
    $count += 1
    $pos = StringInStr ($string, $fileread, 0, 1, $pos) + 1
    Else
    ExitLoop
    EndIf
    WEnd

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

    MsgBox (0, "", "Anzahl von " & $search & " : " & $count)

    [/autoit]

    ;-))
    Stefan

  • [autoit]


    $fileread = "12334" &"i" & "dfhdfhdfh" &"i" &"3445" &"i" & "fffffffggg" &"iii"
    $search = "i"
    $count = 0
    $pos = 1
    While 1
    $searchpos = StringInStr($fileread, $search, 0, 1, $pos)
    If $searchpos Then
    $count += 1
    $pos = $searchpos + 1
    Else
    ExitLoop
    EndIf
    WEnd

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

    MsgBox (0, "", "Anzahl von " & $search & " : " & $count)

    [/autoit]


    Etwas optimiert.

    Oder auch mit Stringsplit:

    [autoit]


    $fileread = "12334" &"i" & "dfhdfhdfh" &"i" &"3445" &"i" & "fffffffggg" &"iii"
    $search = "i"
    $asplit = StringSplit($fileread, $search)
    MsgBox (0, "", "Anzahl von " & $search & " : " & $asplit[0] -1)

    [/autoit]
  • So Fehler gefunden:

    [autoit]

    $search = "Blumen"
    $count = 0
    $pos = 1
    While 1

    If StringInStr ($fileread, $search, 0, 1, $pos) <> 0 Then
    $count += 1
    $pos = StringInStr ($fileread, $search, 0, 1, $pos) + 1
    Else
    ExitLoop
    EndIf
    WEnd

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

    MsgBox (0, "", "Anzahl von " & $search & " : " & $count)

    [/autoit]

    Jetzt will ich das ganze aber etwas komplexer haben:
    Sagen wir mal meine Datei enthält Blumen, die sich unterscheiden. Jetzt möchte ich aber wissen wie es am besten geht, wenn ich zwei Zeilen nach Blumen Lilien drin habe.

    Sprich ich brauche den Unterschied zwischen der Anzahl der Lilien und Rosen Z.B.
    Die Gesamt Anzahl hab ich ja schon mal.

    Dateiaufbau:

    Code
    Blumen:
    Lilien_blaue(17)
    Lilien_rote(80)
    
    
    BLumen:
    Rosen_blaue(12)
    Rosen_rote(14)


    thx

  • Hallo nochmal :)

    BugFix . Leider kann ich mit der Funktion _StringInStringcount nichts anfangen. Ich erkläre wieso:

    Folgendes habe ich in den Eingangsdatei die ich Auswerten möchte:
    Beispiel:

    Ich muss Diese Datei nach Anzahl der User analysieren, was das einfachste ist.
    Jetzt möchte ich aber nur die User Auswerten die, die Applikation A oder C z.B. haben.

    Hatte versucht die Datei als String einzulesen doch ich kann nicht mit _betweenString

    [autoit]

    $beetween = _StringBetween($fileread,"USER","USER")
    _ArrayDisplay($split, "")

    [/autoit]

    arbeiten, da dieser zwischen "USER" und "USER" zwischen zwei Usern festhängt.
    Also ist schon etwas komplexer als ich es mir gedacht hatte, so dass ich momentan fest hänge.

    Die Datei per ReadLine einzulesen komm ich auch nicht wirklich weiter, wie würdet ihr verfahren?

  • Zitat

    da dieser zwischen "USER" und "USER" zwischen zwei Usern festhängt.

    Das ist doch optimal, alles was zwischen User1 und User2 steht kannst du nach deinem Suchstring durchsuchen.

    [autoit]

    #include <Array.au3>

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

    $suche1="Applikation_B"
    $suche2="Applikation_X"

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

    $file=fileopen("user.txt",0)

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

    $data=fileread($file)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $data = ' & $data & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    $array=stringsplit($data,"User:",3)
    _arraydisplay($array)

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

    for $element in $array
    if stringinstr($element,$suche1) or stringinstr($element,$suche2) then msgbox(0,"Gefunden",$element)
    next

    [/autoit]

    folgende Datei "user.txt" wurde verwendet.

    Spoiler anzeigen


    Soll das das Ergebnis sein?
    Natürlich kannst du die Ausgabe noch verfeinern, aber mir gings erstmal darum ob das Problem so gelöst wurde...

  • Ha!!

    Vielen Dank Andy, irgend wie total einfach, war nah dran :)

    Du hast jedoch ein Fehler mit Stringsplit, Delimiter hab ich auf 1 gestellt, somit hat er auch richtig zerteilt.

    Was macht den eigentlich diese Schleife???

    [autoit]

    for $element in $array
    if stringinstr($element,$suche1) or stringinstr($element,$suche2) then msgbox(0,"Gefunden",$element)
    next

    [/autoit]

    Soweit ich das verstanden habe, wird sie solange ausgeführt bis $element im $array vorkommt? Mit der Ergebnis, einer Ausführung der MsgBox?

  • Zitat

    Soweit ich das verstanden habe, wird sie solange ausgeführt bis $element im $array vorkommt? Mit der Ergebnis, einer Ausführung der MsgBox?

    Klick mal auf das "FOR" im Script, und dann statt auf das FOR...TO auf FOR..IN Da stehts recht ausführlich.
    Es wird das gesamte Array Element für Element durchgegangen. Man könnte schreiben

    [autoit]

    For $i=0 to ubound($array)-1
    $element=$array[$i]
    if stringinstr($element,$suche1) or stringinstr($element,$suche2) then msgbox(0,"Gefunden",$element)
    next

    [/autoit]