Datumszeitrum aus Strings erkennen.

  • Hallo, ich habe ein Array aus vielen Daten und zugehörigen einträgen.

    nun möchte ich bei eingabe eines start und enddatums alle einträge die zwischen diesen beiden daten liegen. wie mach ich das?


    bsp.

    01.01.2009 hallo
    02.01.2009 hallo2
    03.01.2009 hallo3

    eingabe 01.02.2009 als start 03.01.2009 als ende

    ausgabe: hallo, hallo2, hallo3

    so in der art.

  • hallo KaVo,

    erstmal willkommen im forum.

    wo, bzw wie hast du die daten in ein array eingetragen? liest du dazu ein textfile oder ähnliches aus, oder hast du es "manuell" im script eingegeben.
    hast du vllt schon mit deinem script angefangen? wenn ja bitte das bisherige script posten.
    das hilft immer wahnsinnig beim helfen :D

    wie möchtest du die einträge zwischen start und enddatum angezeigt bekommen? in einer gui, oder sollen sie vllt in eine datei geschrieben werden?

    bitte alles etwas genauer ausführen, dann finden sich sicher genug die dir gerne helfen

  • Also ihr müsst ja nicht alles machen, nur bei dem Teil hab ich grad kleine Probleme, darum hab ich auch nicht alles geschrieben, was ich will.

    Also es wird aus einem Logfile geschrieben, Format ist: 08.09.2009,13:34:49, EINTRAG

    Anschließend soll er einfach alle Einträge in einem Zeitraum in ein neues Array schreiben.

    Im Spoiler hab ich das nun für ein bestimmtes datum drin.

    versuchs nun aber so zu machen wie Xeno meinte, nur ist halt nicht das richtige Datumsvormat drin, aber kann man ja umdrehen, mal schaun wies passt.

    Spoiler anzeigen

    If Not _FileReadToArray("Log.log", $aAlles) Then
    MsgBox(4096, "Fehler", "Fehler beim Einlesen der Datei in das Array!" & @CRLF & "Fehlercode: " & @error)
    Exit
    EndIf

    For $x = 1 To $aAlles[0]
    $aZeile = StringSplit( $aAlles[$x], "," )

    if $aZeile[1] == '08.09.2009' Then
    $aZeile[3] = StringReplace( $aZeile[3], ";", ",")
    _ArrayAdd( $aWerte, $aZeile[3] )
    EndIf
    Next

    • Offizieller Beitrag

    Probier mal so:

    [autoit]

    Local $vonDate = '2009/01/02'
    Local $bisDate = '2009/01/03'
    Local $array[3] = [ _
    '01.01.2009,13:34:49, hallo', _
    '02.01.2009,13:34:49, hallo2', _
    '03.01.2009,13:34:49, hallo3']

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

    For $i = 0 To UBound($array) -1
    $Date = _strToDate(StringLeft($array[$i], 10))
    If $Date >= $vonDate And $Date <= $bisDate Then ConsoleWrite(StringTrimLeft($array[$i], 21) & @CRLF)
    Next

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

    Func _strToDate($s)
    Return StringRight($s, 4) & '/' & StringMid($s, 4, 2) & '/' & StringLeft($s, 2)
    EndFunc

    [/autoit]
  • Hallo und danke für die Hilfe, habe es jetzt hinbekommen.

    Allerdings läuft mein Script nun 11 Minuten für 3 Tage allein. ich will damit aber auch einen ganzen Monat auswerten können. Kann man es irgendwie verschnellen? es wird ziemlich viel mit riesigen arrays hinundher gearbeitet.

    Zu dem Log: es enthält über 100k Zeilen mit folgender Formatierung pro Zeile: 08.09.2009,13:34:49,TEST

    datum geht insgesamt ca. über 2 Monate.

    [autoit]


    #include <Array.au3>
    #include <File.au3>
    #include <String.au3>
    #include <Date.au3>

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

    Dim $aAlles
    Dim $aWerte[1]
    Dim $aDatum
    Dim $aZeit
    $vonDatum = "2009/09/08"
    $bisDatum = "2009/09/10"

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

    If Not _FileReadToArray("LOG.log", $aAlles) Then
    MsgBox(4096, "Fehler", "Fehler beim Einlesen der Datei in das Array!" & @CRLF & "Fehlercode: " & @error)
    Exit
    EndIf
    For $x = 1 To $aAlles[0]
    $aZeile = StringSplit( $aAlles[$x], "," )

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

    if _strToDate($aZeile[1]) >= $vonDatum And _strToDate($aZeile[1]) <= $bisDatum Then
    $aZeile[3] = StringReplace( $aZeile[3], ";", ",")
    _ArrayAdd( $aWerte, $aZeile[3] )
    EndIf
    Next
    $aUnique = _ArrayUnique($aWerte)
    _FileCreate("test.csv")
    _FileWriteToLine("test.csv", 1, "test")
    For $x = 2 To $aUnique[0]
    $iAnzahl = 0
    For $y = 1 To UBound($aWerte)-1
    if $aUnique[$x] == $aWerte[$y] Then
    $iAnzahl = $iAnzahl + 1
    EndIf
    Next
    _FileWriteToLine("test.csv", ($x)+1, $aUnique[$x] & ";" & $iAnzahl)
    Next
    Func _strToDate($s)
    Return StringRight($s, 4) & '/' & StringMid($s, 4, 2) & '/' & StringLeft($s, 2)
    EndFunc

    [/autoit]
  • oh ups, das wollt ich in meinem post eigentlich dazuschreiben, habs aber wohl vergessen ;)

    also, ich habe vor:

    ich hab nen logfile mit diesen massig einträgen.

    ich will für einen bestimmten zeitraum, den man wählen kann wissen, welcher eintrag wie oft vorgekommen ist.

    sprich

    logfile:

    08.09.2009,13:34:49,hallo
    08.09.2009,13:35:49,TEST
    08.09.2009,13:36:49,hallo

    endergebnis csv:

    hallo 2
    TEST 1

    usw.

  • http://kavo.kilu.de/LOG.zip


    ich hab die logeinträge geändert, da ich die richtigen nicht rumschicken werde. da es jetzt nurnoch so kurze und so viele gleiche strings sind, dauert es nurnoch: Time: 252.509 Sekunden.

    aber im prinzip is das ja egal.

    Einmal editiert, zuletzt von KaVo (21. September 2009 um 16:47)

    • Offizieller Beitrag

    Hi,

    hier mal ein kurzer Autoitversuch:

    Spoiler anzeigen
    [autoit]

    Opt('MustDeclareVars', 1)
    Local $buffer, $date, $start, $end, $file, $info, $rows
    $start = "20090908"
    $end = "20090910"
    $file = FileRead('log.log')
    $info = StringRegExpReplace(StringRegExpReplace($file, ',\d\d:\d\d:\d\d', ''), '(\d\d)\.(\d\d)\.(\d{4})', '\3\2\1')
    $rows = StringSplit($info, @LF)

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

    For $i = 0 To UBound($rows) - 1
    $date = StringLeft($rows[$i], 8)
    If $date >= $start And $date <= $end Then
    $buffer &= $rows[$i] & @CRLF
    EndIf
    Next

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

    StringReplace($buffer, 'a', '')
    ConsoleWrite('Meldung a = ' & @extended & @CRLF)
    StringReplace($buffer, 'b', '')
    ConsoleWrite('Meldung b = ' & @extended & @CRLF)

    [/autoit]

    Mega

  • Ich habe mal deine Ansätze eingebaut, aber es dauert immernoch 11 Minuten.
    Das Problem ist, dass ich die ganzen einträge nicht kenne, und daher alles in einen array schreiben muss, damit ich Uniquearray benutzen kann, um wirklich gleiche einträge zu finden, die ich dann mit dem eigentlichen array vergleichen kann und die anzahl hochzählen kann.

    eine andere möglichkeit sehe ich nicht, wirklich gleiche Werte aus einem string/array rauszubekommen.