Fehlende Idee, um zwei exportierte Report Dateien einzulesen

  • Hallo AutoIt-Community,

    leider stehe ich mal wieder total auf dem Schlauch und brauche euer Feedback, Ideen und Anregungen.

    Über zwei nicht AutoIt-Skripte wird jeweils ein Export eines Reports erstellt. Durch den Umweg über die
    Temp-Datei wird einfach nur gewährleistet, dass der Export auch abgeschlossen ist. Ablauf vereinfacht dargestellt:

    Code
    Start Schleife
    	Export(Temp)
    	Rename(Temp, CSV)
    	Sleep(4000)
    	Delete(CSV)
    Ende Schleife


    Leider war es nicht möglich den Export auch über AutoIt umzusetzen. Es gibt zwar eine COM-Schnittstelle aber diese
    bietet keinen Zugriff auf Echtzeitdaten.

    In AutoIt wird die Import Funktion über Adlib gesteuert und Auszug:

    [autoit]

    local $iTemp = 0
    while FileExists($sR2Path) = 0
    $iTemp += 1
    Sleep(100)
    WEnd

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

    Local $hR2txt = FileOpen($sR2Path, 0)
    $aRepAL = _CSV2Array($hR2txt, ";", True, 1)
    FileClose($hR2txt)

    [/autoit]

    Bei einer Datei werden die Skripte fast synchron (gemessen an $iTemp) aber mit zwei Dateien,
    bleibt er zu oft in einer Schleife hängen und am Ende kommt nur Müll raus ;)

    Gibt es eine einfache Lösung oder bleibt mit nur eine "Multi-Threading" Lösung?

    Danke für eure Hilfe
    ic4u

    Einmal editiert, zuletzt von ic4u (22. Mai 2012 um 09:47)

  • Hey,
    könntest du nochmal erklären was genau du tun willst, denn ich für meinen Teil weis nicht was der 'Export eines Reports' sein soll... ?(
    Lieg ich mit der Vermutung richtig, dass du in deinem Script warten willst bis von einem externen Programm eine bestimmte CSV-Datei im Temp-Verzeichnis erstellt wird, um sie dann auszulesen/verarbeiten oder irgendwo Anders hin zu kopieren...?! ^^

    LG
    Christoph :)

  • Grüße,

    ja der Report ist eine Tabelle die Echtzeit-Werte enthält. Diese Werte werden durch das AutoIt-Skript optisch aufgewertet und können dann von anderen im Team vom Rechner aus betrachtet werden.
    Dabei sollte das Update-Intervall 10 Sekunden nicht überschreiten.

    Zitat

    Lieg ich mit der Vermutung richtig, dass du in deinem Script warten willst bis von einem externen Programm eine bestimmte CSV-Datei im Temp-Verzeichnis erstellt wird, um sie dann auszulesen/verarbeiten oder irgendwo Anders hin zu kopieren...?!

    Im groben ist das korrekt, nur dass es zwei CSV-Dateien sind auf die das Skript warten muss.

  • Meinst du das in etwa so:

    Spoiler anzeigen
    [autoit]

    Dim $CSVFile1 = @TempDir&'\test1.csv', $CSVFile2 = @TempDir&'\test2.csv', $Timer

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

    While 1
    $Timer = TimerInit()
    If FileExists($CSVFile1) Then
    ; Was auch immer du hier tun willst...
    EndIf
    If FileExists($CSVFile2) Then
    ; Was auch immer du hier tun willst...
    EndIf
    If TimerDiff($Timer) < (8*1000) Then Sleep(2000)
    WEnd

    [/autoit]

    LG
    Christoph :)

  • Mit deinem Vorschlag, habe ich wieder das Problem, dass die CSV-Datei in diesem Moment existieren oder auch nicht, dadurch werden die Daten zwischen einen oder mehreren Update-Vorgängen nicht neu geladen.
    Deshalb habe ich mein FileExists als While Schleife (hier nochmal die Funktion zum Einlesen der CSV-Dateien mit Kommentaren):

    [autoit]

    Func _UpdateValues()
    local $iTemp = 0 ;Wert für Debugging
    while FileExists($sR2Path) = 0 ;Warte bis CSV-Datei existiert (Export durch externes Skript ist abgeschlossen)
    $iTemp += 1 ;Debug-Wert erhöhen
    Sleep(100) ;Kurze Pause
    WEnd

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

    Local $hR2txt = FileOpen($sR2Path, 0) ;FileHandle für die CSV-Datei
    $aRepAL = _CSV2Array($hR2txt, ";", True, 1) ;CSV wird in Array eingelesen (UDF)
    FileClose($hR2txt) ;FileHandle beenden
    EndFunc

    [/autoit]


    Dies funktioniert mit einer CSV-Datein zum Einlesen super aber würde man diese Schleife für zwei CSV-Dateien erweitern, läuft bei einer Schleife der Debug-Wert in die Höhe, da nur in seltenen Fällen beide CSV-Dateien zur gleichen Zeit existieren.

  • So, hatte jetzt mal ein paar Tage Abstand dazu (Dank Feiertag) und es hat bing gemacht.

    Habe jetzt die Funktion zum Einlesen so angepasst, dass diese Variable ist und das ganze läuft schon 36 Std. ohne crash und mit normalen Update-Intervall von maximal 10 Sekunden.

    Über AdLib wird die zentrale Update-Funktion aufgerufen, diese schau jetzt so aus:

    [autoit]

    Func _UpdateView()
    _UpdateArray($aRep2, $sR1Path) ;Update Array für Anzeige-Teil1
    If IsArray($aRep2) then _UpdateAnzeige1() ;Update der Anzeige-Teil1
    _UpdateArray($aRep2 , $sR2Path) ;Update Array für Anzeige-Teil2
    If IsArray($aRep2) then _UpdateAnzeige2() ;Update View für Anzeige-Teil2
    EndFunc

    [/autoit]

    Die _UpdateValues von oben schaut jetzt so aus:

    [autoit]

    Func _UpdateArray(ByRef $aRepArray, $sReportPath)
    Local $iTemp = 0 ;Counter für Durchläufe bis Datei existiert

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

    Local $iTime = TimerInit()
    While FileExists($sReportPath) = 0
    $iTemp += 1
    Sleep(100)
    WEnd
    $iTime = TimerDiff($iTime) / 100000
    _MemoWrite("DEBUG: " & StringRight($sReportPath, StringLen($sReportPath) - StringInStr($sReportPath, '\', 2, -1)) & " Time: " & Round($iTime,5) & "ms - Round: " & $iTemp)

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

    Local $hFile = FileOpen($sReportPath, 0)
    $aRepArray= _CSV2Array($hFile, ";", True, 1)
    FileClose($hFile)
    EndFunc

    [/autoit]

    Muss nur noch eventuelle Fehler in der _UpdateArray abfangen.
    Verbesserungsvorschläge gerne Willkommen!