Textdatei auslesen

  • Heyho leute,

    eine Frage mit welchem Befehl kann ich eine Textdatei auslesen?

    Hätte jetzt an FileReadLine gedacht, aber das problem ist da, dass er mir aber nur auslesen soll, was in Anführungszeichen steht.

    Zb:
    Textdatei.txt

    Spoiler anzeigen

    Hallo dies soll ausgelesen "werden".

    Dann sollte er mir dies in einer variablen wiedergeben:

    Spoiler anzeigen

    werden

  • Ich würde einfach die ganze Zeile auslesen und dann mit StringReplace arbeiten. Einfach "Hallo dies soll ausgelesen" durch "" ersetzen ...

  • Ich würde einfach die ganze Zeile auslesen und dann mit StringReplace arbeiten. Einfach "Hallo dies soll ausgelesen" durch "" ersetzen ...

    Das Problem hierbei ist, meine Datei hat nicht nur ein Wort das ausgelesen werden soll sondern Mehrere. So sieht das ganze aus ca:

    textdatei.txt
    "Hallo" das "ist" ein test "zum" auslesen der "daten"

    Nun soll von jedem "" eine variable erstellt werden.

    Den rest könnte ich dann selber.

  • Ich würds so machen:

    Spoiler anzeigen
    [autoit]

    $sString = FileRead($sPath)
    $aString = StringRegExp($sString, '".*"', 1)

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

    For $i = 0 To UBound($aString) - 1
    $aString[$i] = StringTrimLeft($aString[$i], 1)
    $aString[$i] = StringTrimRight($aString[$i], 1)
    Next

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

    ; $aString enthält jetzt alle ergebnisse

    [/autoit]

    Gruss Shadowigor

  • @Shadow: Ich hatte noch nie mit String zu tun, kannst du die einzelnen Schritte etwas erläutern, oder ein Beispielskript machen?
    Wäre lieb, danke!

  • Hallo Shiro2Team,

    ich würde esmit _StringBetween lösen, es gibt aber auch noch StringSplit: Huer eine Ünersichtüber alle 3 Verfahren:

    [autoit]

    #include <String.au3>
    #include <array.au3>

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

    $sString = '"Hallo" das "ist" ein test "zum" auslesen der "daten"'
    $aString = StringRegExp($sString, '".*"', 1)

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

    For $i = 0 To UBound($aString) - 1
    $aString[$i] = StringTrimLeft($aString[$i], 1)
    $aString[$i] = StringTrimRight($aString[$i], 1)
    Next
    _ArrayDisplay($aString, "Regex")

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

    $aSplit = StringSplit($sString, '"', 2)
    For $i = UBound($aSplit) - 1 To 0 Step -1 ;wichtig von hinten anfangen
    If StringLeft($aSplit[$i], 1) = " " Or $aSplit[$i] = "" Then _ArrayDelete($aSplit, $i)
    Next
    _ArrayDisplay($aSplit, "StringSplit")

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

    $aBetween = _StringBetween($sString, '"', '"')
    _ArrayDisplay($aBetween, "Stringbetwen")

    [/autoit]

    Das kürzeste ist _StringBetween, der Regex von Shadowigor funktioniert wie man sieht nicht,

    mfg autoBert

  • Also für StringRegExp wäre der richtige Pattern: ".+?" (inkl. Obenstriche)

    funktioniert nur wenn man auch noch das Rückgabeflag aus Shadowigor's Beispiel anpasst:

    [autoit]

    $sString = '"Hallo" das "ist" ein test "zum" auslesen der "daten"'
    $aString = StringRegExp($sString, '".+?"',3)

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

    For $i = 0 To UBound($aString) - 1
    $aString[$i] = StringTrimLeft($aString[$i], 1)
    $aString[$i] = StringTrimRight($aString[$i], 1)
    Next
    _ArrayDisplay($aString, "Regex")

    [/autoit]

    ändert abernichts an der Tatsache dass es mit StringBetween deutlich kürzer geht:

    [autoit]

    $sString = '"Hallo" das "ist" ein test "zum" auslesen der "daten"'
    $aBetween = _StringBetween($sString, '"', '"')
    _ArrayDisplay($aBetween, "Stringbetwen")

    [/autoit]

    ein weiterer Vorteil, < 1 Min Hilfe anschauen reicht zum verstehen,

    mfg autoBert

  • Ok, sorry dass meins nicht geht. Habs wohl zu wenig getestet... Aber deines oispnr geht bei mir auch nicht. Da bekomme ich nur das erste Wort.

    EDIT: autoBert: Ok, ich sag nichts mehr... Vielleicht übe ich vorher noch ein wenig :whistling:

  • Und wie mache ich das, wenn ich das hier:

    Spoiler anzeigen
    SQL
    <Item vnum="12010" name="'ÁøÃ»°©+0'" gb2312name="Blaustahl-Panzer +0" type="2" subtype="0" weight="0" size="2" antiflag="312" flag="1" wearflag="1" immuneflag="0" gold="3000" buy_price="10000" limittype0="1" limitvalue0="80" limittype1="0" limitvalue1="0" applytype0="8" applyvalue0="4294967290" applytype1="37" applyvalue1="20" applytype2="10" applyvalue2="2" value0="0" value1="154" value2="0" value3="26" value4="0" value5="0" socket0="0" socket1="64848" socket2="127" socket3="65008" socket4="21631" socket5="4855" refine_vnum="12011" refine_set="531" magic_pct="15" specular="0" socket_pct="3" />

    In diese Reihenfolge bekommen will?

    Spoiler anzeigen
    SQL
    INSERT INTO `item_proto` VALUES (12010, "Blaustahl-Panzer+0 ", "Blaustahl-Panzer+0", 2, 0, 0, 2, 312, 1, 1, '', 10000, 3000, 11, 1, 0, 15, 1, 80, 0, 0, 8, 4294967290, 37, 20, 10, 2, 0, 154, 0, 26, 0, 0, 0, 64848, 127, 65008, 21631, 4855, 0, 3, 0);

    Also das erste ist zB. meine text.txt in der ersten Zeile drin. Nun möchte ich alles ausgelesen habe, was in Anführungszeichen ist und dann soll er mir eine neue textdatei erstellen zB. mit dem namen neu.txt und dort dann die Ausgelesenen Sachen im beschriebenen format einfügen.

  • Aufgrund der Inhalte des Strings rate ich dir die Forenregeln zu lesen, bevor du unnötig Zeit in ein Projekt investierst,bei dem dir später keiner mehr hilft,

    ansonsten kannst du soetwas so:

    [autoit]

    #include <String.au3>
    #include <array.au3>

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

    $sString = FileReadLine(@ScriptDir & "\test.txt") ;in diesem File steht die Textzeile

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

    $aBetween = _StringBetween($sString, '"', '"')
    _ArrayDisplay($aBetween, "Stringbetwen")

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

    $hFile = FileOpen(@ScriptDir & "\mydb.sql",2) ;Datei öffnen 1 = anhängen 2=überschreiben

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

    $sNew = "INSERT INTO `item_proto` VALUES ("
    for $i= 0 to UBound($aBetween) -1
    if StringLeft($aBetween[$i],1) <> "'" then $sNew &= $aBetween[$i]
    if $i <> UBound($aBetween) -1 then $sNew &= ","
    Next
    $sNew &= ");"

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

    FileWriteLine($hFile,$sNew) ;Zeile schreiben
    FileClose($hFile) ;Datei wieder schliessen

    [/autoit]

    lösen,

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (12. Februar 2012 um 20:45)