file nach begriffen auslesen

  • Hallo, ich habe eine Frage

    Ich habe gerade in 'Board gelesen das man aus einer Datei bestimmte Wörter extrahieren kann

    ich versuche gerade mir eine liste zu erzeugen mit Namen

    diese sind auf einer internetseite

    bevor der Name kommt steht immer

    Code
    user/*****

    Sternchen stehen für denn variable Namen

    vor und hinter diesen "user/" steht halt der normale Quelltext, denn ich nicht benötige

    schaut ungefähr so aus

    Code
    :<a href="/user/ChristianVu" target="ChristianVu" onclick="return p('ChristianVu')" class="fre">ChristianVu</a><br>


    wie stelle ich das an, das mir das script nur das wort (in diesen Fall ChristianVu) in eine TXt schreibt?
    pro Quelltxt sind es 20 solcher namen die aber immer anders sind

    leider kommt ich damit nicht voran, eine txt mit den quelltext habe ioch schon (7mb, passt aber)

    mit strinbetween komme ich nicht ganz klar

    schreibt er mir immer 0 also fehler:(

    grüße

    Einmal editiert, zuletzt von devildevil3 (23. April 2007 um 16:34)

  • Hi,
    ich würde das jetzt somachen das ich die Datei in eine Variable einlese und dann nach (' ') suche.
    Ergebnis wegschreiben.

    aArray1 = _StringBetween('<Variable mit innhalt, '('', '')');

    Das wäre jetzt mein Vorschlag.

    MfG
    Der_Doc

    • Offizieller Beitrag

    Oder so:

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    $dateiQuelltext = "blabla.txt"
    $fh = FileOpen($dateiQuelltext,0)
    $pattern = "((?<=user/)\w*)"
    $string = FileRead($fh) ; liest gesamte Datei in eine Variable
    FileClose($fh)
    ; Muster:
    ;$string = ':<a href="/user/ChristianVu" target="ChristianVu" onclick="return p' & "('ChristianVu')"& 'class="fre">ChristianVu</a><br>' & @CRLF & _
    ;':<a href="/user/MartinIx" target="ChristianVu" onclick="return p' & "('ChristianVu')"& 'class="fre">ChristianVu</a><br>' & @CRLF & _
    ;':<a href="/user/GustavKnuth" target="ChristianVu" onclick="return p' & "('ChristianVu')"& 'class="fre">ChristianVu</a><br>'

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

    $arSelect = StringRegExp($string, $pattern,3)
    _ArrayDisplay($arSelect, "Gefunden")

    [/autoit]
  • habs jetzt so gelöst

    [autoit]

    #include<string.au3>
    #include<array.au3>
    #include <file.au3>
    $file = FileOpen("test.txt",0)
    $file2 = FileOpen("namen.txt",1)
    While 1
    $file1 = FileReadLine($file)
    ;MsgBox(0,"",$file1)
    Global $str = $file1
    $a = _StringBetween($str, '/user/', '" ')
    $file3 = _ArrayDisplay($a, 'Users')
    ;MsgBox(0,"",$a)
    FileWrite($file2, $a&@CRLF)
    WEnd

    [/autoit]

    werde mich für das sript von bugfix entscheiden, vergisst der keine user/;
    Problem bei beiden scripten wie bekomme ich die namen in eine txt?

    wie kann man das noch am besten lösen?
    EDIT
    mir fällt gerade auf das meins die bessere lösung ist, weil von bugfix die namen nciht richtig rausholt zb steht bei einen

    Code
    <div class="ssa"><a href="/user/marcel-----16" class="ssu"><img src="xs402009_1168176059.jpg" class="ssb" border="0" alt="marcel-----16"></a>

    bei meinen kommt marcel----16 raus, bei bugix nur marcel

    ligt wohl an dem

    [autoit]

    $pattern = "((?<=user/)\w*)"

    [/autoit]


    aber bessere match fällt mir auch nicht ein

    grüße

    3 Mal editiert, zuletzt von devildevil3 (23. April 2007 um 21:21)

    • Offizieller Beitrag

    Das verwendete Pattern sucht nach alphanumerischen Zeichen (Buchstaben, Ziffern, Unterstrich). Wenn in dem Namen noch andere Zeichen enthalten sein können, so läßt sich das problemlos einfügen. Nur ein ' " ' wäre problematisch, da dieser sich sehr gut als Begrenzer macht ;)

    Edit: Verwende den Pattern: "((?<=user/)[^"]+)" ==> alles nach 'user/' aber kein "

    Wie wird wieder Text draus?
    Das RegEx-Ergebnis ist ein Array. ==> _FileWriteFromArray( )


    @pee: Hast recht, Negation von " (^"). Bin heut nich voll da ;)

  • dadurch findet er nichts mehr

    [autoit]


    ; Script Start - Add your code below here

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

    #include <array.au3>
    $dateiQuelltext = "test.txt"
    $fh = FileOpen($dateiQuelltext,0)
    $pattern = "((?<=user/)[\w-.!§$%&()/=?`´+#h]*)"
    $string = FileRead($fh) ; liest gesamte Datei in eine Variable
    FileClose($fh)
    ; Muster:
    ;$string = ':<a href="/user/ChristianVu" target="ChristianVu" onclick="return p' & "('ChristianVu')"& 'class="fre">ChristianVu</a><br>' & @CRLF & _
    ;':<a href="/user/MartinIx" target="ChristianVu" onclick="return p' & "('ChristianVu')"& 'class="fre">ChristianVu</a><br>' & @CRLF & _
    ;':<a href="/user/GustavKnuth" target="ChristianVu" onclick="return p' & "('ChristianVu')"& 'class="fre">ChristianVu</a><br>'

    $arSelect = StringRegExp($string, $pattern,3)
    _ArrayDisplay($arSelect, "Gefunden")
    sleep(1000)

    [/autoit]


    ist komisch wenn ich nur $pattern = "((?<=user/)\w*)" benutze findet er was wenn ichs so mache wie ihr jetzt garnischts mehrO.o

    das _filewritefromarray scheint auch nicht zu klappen, die datei bleibt leerO.o

    • Offizieller Beitrag

    So, habs mit deiner Datei getestet - funzt prima.
    Da viele Namen mehrfach auftauchen, habe ich dir gleich noch 'ne Routine zum Entfernen der Dopplungen beigefügt.

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    #include <file.au3>
    $pattern = '((?<=user/)[^"^/]+)' ; Slash gehört nicht zum Namen - auch raus
    $file = @ScriptDir & "\test.txt"
    $fileout = @ScriptDir & "\testout.txt"
    $fh = FileOpen($file,0)
    $string = FileRead($fh)
    $arOut = StringRegExp($string, $pattern,3)
    FileClose($fh)
    _ArraySort($arOut) ; sortieren
    ; hier die Doppelentfernung, wenn gewünscht, einfügen
    _FileWriteFromArray($fileout, $arOut) ; statt $arOut: $arOhneDoppel)

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

    ; wenn doppelte Namen raussortiert werden sollen:

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

    Dim $arOhneDoppel[1]
    $arOhneDoppel[0] = ""
    For $i = 0 To UBound($arOut)-1
    $doppel = 0
    For $k = 0 To UBound($arOhneDoppel)-1
    If $arOhneDoppel[$k] = $arOut[$i] Then $doppel = 1
    Next
    If $doppel = 0 Then
    If $arOhneDoppel[0] = "" Then
    $arOhneDoppel[0] = $arOut[$i]
    Else
    _ArrayAdd($arOhneDoppel, $arOut[$i])
    EndIf
    Else
    $doppel = 0
    EndIf
    Next

    [/autoit]
    • Offizieller Beitrag

    Hi,

    verstehe den Ansatz nicht. Die _StringBetween Funktion ist doch perfekt dafür. Ich würde auch ehrlicherweise dazu raten, die Lösung nehmen. Erstens ist sie nicht langsamer und zweitens viiiiel leichter anzupassen. Gerade wenn du noch nicht so fit mit RegExp bist.

    Aber naja, ... :rofl_devil:

    So long,

    Mega

  • @th.meger, ja du hast recht die _stingbetwen methode gehtgenauso,funktioniert auch, aber man will ja immer dazulernen auch wenns viel aufeinmal ist, danke euch allen

    so läuft alles

    2 Mal editiert, zuletzt von devildevil3 (24. April 2007 um 20:00)