Text Datei rausfilter und Speichern

  • Guten Abend :)

    Ich bräuchte hilfe bei einem Skript da ich noch Anfänger und unerfahren bin wollte ich hier nach Rat fragen :)
    Und zwar wollte ich das das skript aus einer txt datei rausfiltern und die seprat in einer Txt datei speichert.
    Der text sind ungefähr so aus:

    [10:24:1]
    8.07.2014 22:38:22 Teebecher=5112
    8.07.2014 22:38:22 Kaffeebecher=2993
    9.07.2014 08:06:49 Teebecher=8506
    9.07.2014 08:06:49 Kaffeebecher=4980
    9.07.2014 23:17:27 Teebecher=4855
    9.07.2014 23:17:27 Kaffeebecher=2843
    [10:4:5]
    8.07.2014 22:38:22 Teebecher=1991
    8.07.2014 22:38:22 Kaffeebecher=2780
    9.07.2014 12:02:52 Teebecher=1410
    9.07.2014 12:02:52 Kaffeebecher=1968


    und zwar soll das Skripte alle Teebecher und Kaffeebecher aus [10:24:1] seprat zusammen rechnen und mir den durchschnitt ausgeben in eine Text datei

    lG
    Pumpenpole

  • Also hier was schnell gebastelt (du hast zu wenig Informationen gegeben wie zum Beispiel (nur 10:24:1 auslesen oder wie soll die Output Datei aussehen usw):

    [autoit]


    Local $iKaffeeAnzahl = 0,$iKaffee = 0,$iTeeAnzahl = 0,$iTee = 0
    $aData = IniReadSection("HIER DEN PFAD ZU DER TXT ANGEBEN","10:24:1")

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

    For $i = 1 to $aData[0][0]
    If StringInStr($aData[$i][0],"Teebecher") <> 0 Then
    $iTee += Int($aData[$i][1])
    $iTeeAnzahl += 1
    ElseIf StringInStr($aData[$i][0],"Kaffeebecher") <> 0 Then
    $iKaffee += Int($aData[$i][1])
    $iKaffeeAnzahl += 1
    Else
    ContinueLoop
    EndIf
    Next

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

    FileWriteLine(@ScriptDir & "\Output.txt","Anzahl der Kaffebecher beträgt:" & $iKaffee & " Der Durchschnitt:" & $iKaffee/$iKaffeeAnzahl)
    FileWriteLine(@ScriptDir & "\Output.txt","Anzahl der Kaffebecher beträgt:" & $iTee & " Der Durchschnitt:" & $iTee/$iTeeAnzahl)

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

    Exit

    [/autoit]

    Also bezieht sich dieses Beispiel nur auf die Wünsche die du open geäußert hast. (Man kann das alles vieeel schöner gestalten :D )

    :thumbup:

    • Offizieller Beitrag

    Hier mal eine RegExp-Variante ;)

    Spoiler anzeigen
    [autoit]

    $s = _
    '[10:24:1]' & @CRLF & _
    '8.07.2014 22:38:22 Teebecher=5112' & @CRLF & _
    '8.07.2014 22:38:22 Kaffeebecher=2993' & @CRLF & _
    '9.07.2014 08:06:49 Teebecher=8506' & @CRLF & _
    '9.07.2014 08:06:49 Kaffeebecher=4980' & @CRLF & _
    '9.07.2014 23:17:27 Teebecher=4855' & @CRLF & _
    '9.07.2014 23:17:27 Kaffeebecher=2843' & @CRLF & _
    '[10:4:5]' & @CRLF & _
    '8.07.2014 22:38:22 Teebecher=1991' & @CRLF & _
    '8.07.2014 22:38:22 Kaffeebecher=2780' & @CRLF & _
    '9.07.2014 12:02:52 Teebecher=1410' & @CRLF & _
    '9.07.2014 12:02:52 Kaffeebecher=1968' & @CRLF

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

    $section = "10:24:1"
    $matchSection = StringRegExp($s, "\[" & $section & "]\r\n([^[]+)", 1)
    _StringRegExpReplace_Callback($matchSection[0], "(Teebecher|Kaffeebecher)=(\d+)", "_AddItem('$1', '$2')")

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

    $ErgebnisArray = _AddItem('', '', 'get')
    ConsoleWrite('ELEMENT' & @TAB & @TAB & 'Anz. ges.' & @TAB & 'Durchschnitt' & @LF)
    ConsoleWrite($ErgebnisArray[0][0] & @TAB & $ErgebnisArray[0][1] & @TAB & @TAB & $ErgebnisArray[0][1] / $ErgebnisArray[0][2] & @LF)
    ConsoleWrite($ErgebnisArray[1][0] & @TAB & $ErgebnisArray[1][1] & @TAB & @TAB & $ErgebnisArray[1][1] / $ErgebnisArray[1][2] & @LF)

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

    Func _AddItem($_type='', $_count='', $_mode='add')
    Local Static $aRet[2][3] = [['Teebecher',0,0],['Kaffeebecher',0,0]]
    Local $i = 0
    Switch $_mode
    Case 'add'
    If $_type <> 'Teebecher' Then $i = 1
    $aRet[$i][1] += $_count
    $aRet[$i][2] += 1
    Case 'get'
    Return $aRet
    EndSwitch
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _StringRegExpReplace_Callback
    ; Description ...: Replaces ByRef all matches in a string by manipulation of the matches in a callback function
    ; Parameters ....: $sString String to manipulate
    ; ...............: $sPattern RegExp pattern for the match
    ; ...............: $sCallback Callback function as string, i.e. "MyCallback('$1')" -- '$1' represents the match
    ; .....optional..: $sBefore String to insert before the manipulated match
    ; .....optional..: $sAfter String to insert after the manipulated match
    ; Return values .: Success 1
    ; ...............: Failure 0 set error = 1
    ; Author ........: Taz77
    ; ===============================================================================================================================
    Func _StringRegExpReplace_Callback(ByRef $sString, $sPattern, $sCallback, $sBefore = '', $sAfter = '')
    $sString = Execute("'" & StringRegExpReplace(StringReplace($sString, "'", Chr(26), 0, 2), $sPattern, $sBefore & "'&" & $sCallback & "&'" & $sAfter) & "'")
    If @error Then
    ConsoleWrite('_StringRegExpReplace_Callback error! Pattern: "' & $sPattern & '", Callback: "' & $sCallback & '"' & @LF)
    Return SetError(1,0,0)
    EndIf
    $sString = StringReplace($sString, Chr(26), "'", 0, 2)
    Return 1
    EndFunc ;==>_StringRegExpReplace_Callback

    [/autoit]
  • Das ist nur ein ausschnitt aus der Txt datei die ist in wirklichkeit länger ungefähr so:

    [10:24:1]

    8.07.2014 22:38:22 Teebecher=5112

    8.07.2014 22:38:22 Kaffeebecher=2993

    9.07.2014 08:06:49 Teebecher=8506

    9.07.2014 08:06:49 Kaffeebecher=4980

    9.07.2014 23:17:27 Teebecher=4855

    9.07.2014 23:17:27 Kaffeebecher=2843

    [10:24:5]

    8.07.2014 22:38:22 Teebecher=1991

    8.07.2014 22:38:22 Kaffeebecher=2780

    9.07.2014 12:02:52 Teebecher=1410

    9.07.2014 12:02:52 Kaffeebecher=1968
    [10:24:10]

    8.07.2014 22:38:22 Teebecher=5112

    8.07.2014 22:38:22 Kaffeebecher=2993

    9.07.2014 08:06:49 Teebecher=8506

    9.07.2014 08:06:49 Kaffeebecher=4980

    9.07.2014 23:17:27 Teebecher=4855

    9.07.2014 23:17:27 Kaffeebecher=2843

    [10:4:35]

    8.07.2014 22:38:22 Teebecher=1991

    8.07.2014 22:38:22 Kaffeebecher=2780

    9.07.2014 12:02:52 Teebecher=1410

    9.07.2014 12:02:52 Kaffeebecher=1968
    [10:24:14]

    8.07.2014 22:38:22 Teebecher=5112

    8.07.2014 22:38:22 Kaffeebecher=2993

    9.07.2014 08:06:49 Teebecher=8506

    9.07.2014 08:06:49 Kaffeebecher=4980

    9.07.2014 23:17:27 Teebecher=4855

    9.07.2014 23:17:27 Kaffeebecher=2843

    [10:99:5]

    8.07.2014 22:38:22 Teebecher=1991

    8.07.2014 22:38:22 Kaffeebecher=2780

    9.07.2014 12:02:52 Teebecher=1410

    9.07.2014 12:02:52 Kaffeebecher=1968

    Die Zahlen in den Eckigenklammer sind immer unterschiedlich.


    Am besten ist es wenn er die in aus einer txt datein liest und dann in einer txt datei speichert und nur die aussortiert die unter einen bestimmten durchschnitswert sind

    2 Mal editiert, zuletzt von pumpenpole (30. Juli 2014 um 17:32)

    • Offizieller Beitrag

    Wie man es auswertet wurde dir gezeigt.
    Datei Lesen / Schreiben solltest du wohl hinbekommen --- oder wenigstens einen Ansatz liefern. Wenn du nach jedem Lösungsvorschlag mit einem neuen Detail rauskommst, was da eigentlich anders sein sollte, wirst du hier keine Hilfe bekommen. Klare strukturierte Ansage, was die Ausgangslage ist, wie soll das Endergebnis sein, Skript von dir bis dahin. DAS erwarten wir.

  • Mein Beispiel nochmal bisschen abgeändert:

    [autoit]


    Local $sFile = "HIER DEN PFAD ZU DER DATEI ANGEBEN",$sOutput = "HIER DEN PFAD FÜR DIE OUTPUT DATEI ANGEBEN",$iKaffeeAnzahl = 0,$iKaffee = 0,$iTeeAnzahl = 0,$iTee = 0,$iLimitDurchschnitt = 5000

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

    $aSec = IniReadSectionNames($sFile)

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

    For $i = 1 to $aSec[0]
    $aData = IniReadSection($sFile,$aSec[$i])
    For $ii = 1 to $aData[0][0]
    If StringInStr($aData[$ii][0],"Teebecher") <> 0 Then
    $iTee += Int($aData[$ii][1])
    $iTeeAnzahl += 1
    ElseIf StringInStr($aData[$ii][0],"Kaffeebecher") <> 0 Then
    $iKaffee += Int($aData[$ii][1])
    $iKaffeeAnzahl += 1
    Else
    ContinueLoop
    EndIf
    Next
    If $iKaffee/$iKaffeeAnzahl < $iLimitDurchschnitt Then
    FileWriteLine($sOutput,"Unter dem standard Durchschnitt ---> " & $aSec[$i] & " --- Anzahl der Kaffebecher beträgt:" & $iKaffee & " Der Durchschnitt:" & $iKaffee/$iKaffeeAnzahl)
    EndIf
    If $iTee/$iTeeAnzahl < $iLimitDurchschnitt Then
    FileWriteLine($sOutput,"Unter dem standard Durchschnitt ---> " & $aSec[$i] & " --- Anzahl der Teebecher beträgt:" & $iTee & " Der Durchschnitt:" & $iTee/$iTeeAnzahl)
    EndIf
    If $iTee/$iTeeAnzahl > $iLimitDurchschnitt or $iKaffee/$iKaffeeAnzahl > $iLimitDurchschnitt Then
    FileWriteLine($sOutput,"Über dem standard Durchschnitt ---> " & $aSec[$i])
    EndIf
    Next

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

    Exit

    [/autoit]

    Den standard Durchschnitt gibst du der Variable $iLimitDurchschnitt

    :thumbup: