[gelöst] Rechnen mit For to step

  • Hey Leute,

    ich hab mal wieder ein Problem bei dem ich nicht weiterkomme.

    Ich bin grab bei einem Skript, das eine Text Datei zeilenweise ausliest, die Zeilen splittet und immer den Geldbetrag aus der jeweiligen Zeile ausgibt. Soweit so gut.
    Der jeweilige Betrag soll aber nicht ausgegeben werden, sondern die beträge sollen Mulitpliziert werden. Leider finde ich kein Ansatzpunkt wie ich dies hinbekomme.

    Hier mal mein Skript:

    [autoit]


    Func gehalt($einnahmenOutput)
    Local $countlines = _FileCountLines($einnahmenOutput)
    Local $file = FileOpen($einnahmenOutput, 0)

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

    ; Check if file opened for reading OK
    If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf

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

    If $countlines > 1 Then
    For $i = 1 To $countlines Step 1
    $line = FileReadLine($file)
    $betrag = StringSplit($line, " ")
    If @error = -1 Then ExitLoop
    $ergebnis = $betrag[2]
    ; MsgBox(0,"", $betrag[2])
    Next

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

    Else
    $line = FileReadLine($file)
    $betrag = StringSplit($line, " ")
    GUICtrlCreateLabel($betrag[2], 260, 107, 100, 17)
    EndIf
    FileClose($file)
    EndFunc

    [/autoit]

    Danke schon mal für eure Hilfe.

    Gruß

    0cool

    Gut das fragen nichts kostet :)

    2 Mal editiert, zuletzt von 0cool (7. Juli 2012 um 19:41)

  • Zum Beispiel so:

    Spoiler anzeigen

    Nicht erschrecken ich hab dein Script nur noch etwas aufgeräumt... ^^

    [autoit]

    #include <File.au3>
    ConsoleWrite('Gehalt: ' & _Gehalt(@ScriptDir & '\test.txt')&@CRLF)

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

    Func _Gehalt($File)
    Local $Lines = _FileCountLines($File), $Handle = FileOpen($File, 0), $Return = 1
    If $Handle = -1 Then
    MsgBox(16, "Error", "Unable to open file.")
    Exit
    EndIf
    If $Lines > 0 Then
    For $i = 1 To $Lines
    $CurrentLine = FileReadLine($Handle, $i)
    If $CurrentLine <> '' Then
    $Array = StringSplit($CurrentLine, " ")
    If IsArray($Array) And $Array[0] >= 2 Then $Return *= $Array[2]
    EndIf
    Next
    EndIf
    FileClose($Handle)
    Return $Return
    EndFunc ;==>_Gehalt

    [/autoit]

    LG
    Christoph :)

  • Da deine Erklärung nicht sehr eindeutig ist und dein Code allgemein schwer verständlich ist, habe ich ziemlich sicher nicht das, was du wolltest...
    Aber vielleicht ist es ja ein Ansatz. Mal schauen.

    Spoiler anzeigen
    [autoit]

    MsgBox (0, 'Gehalt', _Gehalt ('list.txt'))

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

    Func _Gehalt ($s_Path)
    Local $a_Line = StringSplit (FileRead ($s_Path), @CRLF, 1) ; Liest die Datei aus
    If @error Then Return SetError (1, 0, '') ; und splittet sie an den Zeilenumbrüchen

    Local $a_Val, $i_Val, $s_Ret

    For $i = 1 To $a_Line[0] ; Checkt jede Zeile ab
    $a_Val = StringSplit ($a_Line[$i], ' ') ; und Splittet die Zeilen an den Leerzeichen

    $i_Val = 1
    For $j = 1 To $a_Val[0] ; Multipliziert die einzelnen Splits
    $i_Val *= $a_Val[$j] ; in einer Schleife miteinander
    Next ; (führt zu einem Fehler, falls eines der Splits keine Zahl ist)

    $s_Ret &= $i_Val &@CRLF ; Verknüpft die einzelnen Ergebnisse untereinander
    ConsoleWrite ($i_Val &@CRLF) ; Debug...
    Next

    Return $s_Ret ; Gibt die ganzen Ergebnisse zurück
    EndFunc

    [/autoit]

    €: Ai ai, Christoph war schneller... .__.

  • Danke an euch beide für eure Hilfe, leider bringt mich das nicht wirklich weiter.

    Ich konkretisiere mal was ich meine. (Wäre am Anfang ganz gut gewesen :wacko: )

    Ausgangspunkt: im Arbeitsverzeichnis liegt eine Text Datei mit belieb vielen Zeilen. Die Zeilenanzahl ist beim öffnen der Zeile nicht bekannt.
    Die Text Datei ist folgener massen aufgebaut:

    Text 123.23
    Text1 45.78

    Was bisher funktioniert:

    • Die Zeilen der Text Datei werden gezählt und in deine Variable geschrieben
    • Die Text Datei wird zeilen weise eingelesen
    • Jede Zeile wird gesplittet (durch das leerzeichen)
    • Der Betrag der jeweiligen Zeile wir in ein Array gespeichert
    • Der jeweilige Betrag über eine MsgBox ausgeben

    Mein Ziel:

    • Alle Beträge zusammen Zählen und in einer MsgBox das Ergebnis ausgeben

    Ich hoffe das ich jetzt mein Ziel gut erklärt habe.
    Gruß

    0cool

    Gut das fragen nichts kostet :)

  • Warum bringen dich unsere Vorschläge denn nicht weiter? Hast du sie denn getestet? Wenn man davon absieht, dass zuerst von Multiplizieren die Rede war, tut mein Beispiel doch genau das was deine ursprüngliche Funktion tun sollte? Da du nun die Beträge addierern möchtest muss man nur 2 Zeichen im Script ändern und sie werden addiert und zurück gegeben: ?(

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    ConsoleWrite('Gehalt: ' & _Gehalt(@ScriptDir & '\test.txt')&@CRLF)

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

    Func _Gehalt($File)
    Local $Lines = _FileCountLines($File), $Handle = FileOpen($File, 0), $Return = 0
    If $Handle = -1 Then
    MsgBox(16, "Error", "Unable to open file.")
    Exit
    EndIf
    If $Lines > 0 Then
    For $i = 1 To $Lines
    $CurrentLine = FileReadLine($Handle, $i)
    If $CurrentLine <> '' Then
    $Array = StringSplit($CurrentLine, " ")
    If IsArray($Array) And $Array[0] >= 2 Then $Return += $Array[2]
    EndIf
    Next
    EndIf
    FileClose($Handle)
    Return $Return
    EndFunc ;==>_Gehalt

    [/autoit]

    LG
    Christoph :)

  • @christop54: Sorry du hast recht ich bin Neuling was AutoIt angeht und hab den Code nicht ganz verstanden. Aber jetzt blick ich Ihn.Das Skript funktioniert wunderbar.
    Vielen Dank!

    Gruß

    0cool

    Gut das fragen nichts kostet :)