Werte aus Zeile auslesen und speichern

  • Guten Morgen,

    Ich möchte aus einer Datei die zb folgendes enthält:

    [autoit]

    27x frettchen 84x bälle 39x hunde 2x katzen Summe: 434,40 euro

    [/autoit]


    Die Waren und die dazugehörige Menge auslesen und in eine Ini Datei schreiben.

    Warenbezeichnung und Menge ändern sich , bei jedem neuen einlesen.


    Wollte den gleichen Weg gehen wie diesen hier .

    Leider bekomme ich es nicht hin, da ich in diesem Fall ja keine festen Werte habe

    zwischen denen ich suchen lassen kann ?! , ausser dem "x"


    Kann mir bitte jemand sagen,

    wie ich das jetzt realisieren kann?


    Danke

    Sauerlaender

  • Oscar war wieder schneller :) und seine Version ist besser (eben wird's poetisch)!

    Hier meine Version:

    [autoit]


    #include <Array.au3>
    Global $aTokens, $i, $readline, $sData, $sIni

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

    $readline = "27x frettchen 84x bälle 39x hunde 2x katzen Summe: 434,40 euro"
    $aTokens = StringSplit(StringLeft($readline, StringInStr($readline, " Summe:") - 1), " ")
    ;~ _ArrayDisplay($aTokens)

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

    For $i = 1 To UBound($aTokens) - 2 Step 2
    ;~ $sData &= $aTokens[$i + 1] & "=" & $aTokens[$i] & @LF ;mit x
    $sData &= $aTokens[$i + 1] & "=" & StringMid($aTokens[$i], 1, StringLen($aTokens[$i]) -1 ) & @LF ;ohne x
    Next

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

    $sIni = @ScriptDir & "\Waren.ini"
    IniWriteSection($sIni, "Waren", $sData)

    [/autoit]

    Ich muss mir mal die Funktion StringRegExp() rein ziehen. Scheint richtig mächtig zu sein!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Danke euch beiden!

    Wie kann man es jetzt nochweiter verfeinern wenn man die ini so aufgebaut haben möchte?


    [frettchen]
    anzahl=27
    [bälle]
    anzahl=84
    [hunde]
    anzahl=39
    [katzen]
    anzahl=2

    [summe]

    euro=434,40


    Bin mal wieder auf dem Desktop und versuchs solnage selbst rauszufinden ;)

  • Hi,

    schau Dir mal in der Hilfe die Funktionen IniRead* und IniWrite* an.
    Damit solltest Du mit einer geeigneten Schleife dein Ziel erreichen.

    Bei Problemen poste Deinen bis dahin erzeugten Code......

    ;-))
    Stefan

  • Was für eine Ini? Vorher? Hinterher?

    Beschreib mal genau. Wie sieht die Datei vorher aus (am besten eine Beispieldatei posten) und was soll dann rauskommen?


    Wenn ich den Code von UEZ nehme, erstellt er mir eine ini mit folgendem Inhalt :

    [Waren]
    frettchen=27
    bälle=84
    hunde=39
    katzen=2


    für meine Zwecke bräuchte ich aber so eine ausgabe:

    [frettchen]
    anzahl=27
    [bälle]
    anzahl=84
    .......

    .......

    .......
    [summe]
    euro=434,40


    das textfile was ausgelesen wird ist immer gleich aufgebaut :
    27x frettchen 84x bälle 39x hunde 2x katzen Summe: 434,40 euro
    nur die Anzahl, Warenbezeichnung und Summe ändern sich immer.


    ##

    ok komme der Sache näher.. bin ja Lernbereit und warte nicht darauf das andere mir alles abnehmen :)


    [autoit]


    #include <Array.au3>
    $text = '27x frettchen 84x bälle 39x hunde 2x katzen Summe: 434,40 euro'
    $aFound = StringRegExp($text, '(.*?)x',3)
    _ArrayDisplay($aFound)

    [/autoit]

    erstmal nur als bildschirmausgabe, damit ich sehe was passiert.

    Jetzt gibt er mir leider nur den ersten wert richtig aus, alles danach folgende wieder mit warenbezeichnung

    Einmal editiert, zuletzt von Sauerlaender (2. Dezember 2009 um 10:09)

  • Hi,

    Du hast den falschen StringRegexp verwendet.

    [autoit]

    $text = '27x frettchen 84x bälle 39x hunde 2x katzen Summe: 434,40 euro'
    ;$aFound = StringRegExp($text, '(.*?)x',3)
    $aFound = StringRegExp($text, '(\d+x .+?) ', 3)

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

    For $i = 0 To UBound ($aFound) - 1
    $temp = StringSplit (StringReplace ($aFound [$i], " ", ""), "x", 2)
    IniWriteSection (@ScriptDir & "\test.ini", $temp [1], "Anzahl=" & $temp [0])
    Next

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

    Run ("notepad.exe " & @ScriptDir & "\test.ini")

    [/autoit]

    ;-))
    Stefan

  • Hier meine Version modifiziert:

    [autoit]


    Global $aTokens1, $aTokens2, $i, $readline, $sData, $sIni

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

    $readline = "27x frettchen 84x bälle 39x hunde 2x katzen Summe: 434,40 euro"
    $aTokens1 = StringSplit(StringLeft($readline, StringInStr($readline, " Summe:") - 1), " ")
    $aTokens2 = StringSplit(StringRight($readline, StringLen($readline) - StringInStr($readline, ": ") - 1) , " ")

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

    $sIni = @ScriptDir & "\Waren.ini"
    For $i = 1 To UBound($aTokens1) - 2 Step 2
    IniWriteSection($sIni, $aTokens1[$i + 1], "Anzahl=" & StringMid($aTokens1[$i], 1, StringLen($aTokens1[$i]) -1 ) & @LF)
    Next
    IniWriteSection($sIni, "Summe", $aTokens2[2] & "=" & $aTokens2[1] & @LF)
    Exit

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Herzlichen Dank euch allen!

    Um gescheit mit StringRegExp , StringSplit usw richtig umgehen zu können,

    muss ich echt noch ne Menge lernen...


    Dann werd ich mich jetzt mal an meine nächsten Problemchen machen

    und hoffe ich muss hier nicht zuviel nachfragen ;)


    Gruß

    Sauerlaender

  • Zitat

    Ich muss mir mal die Funktion StringRegExp() rein ziehen. Scheint richtig mächtig zu sein!

    So gehts mir seit Jahren^^.
    Aber da ich (in den meisten Fällen) mit den "normalen" Stringbefehlen zum Ziel komme und das in einer für mich "nachvollziehbaren" Form, fristet diese mächtige Funktion LEIDER nur ein Schattendasein. Wahrscheinlich fehlt wie bei den meisten anderen Anwendungen (Datenbank, Grafik, TCP) das "richtige Problem". Wenn man gezwungen ist, sich bis zum Hals reinzuknien, dann sinkt die Hemmschwelle rapide :rolleyes: und man bekommt schnell den Einstieg...