Neueste Dokumente kopieren

  • Hallo jmewald,

    ich hab mal eine Listview-Routine auf dein Ergebnis.TXT angepasst,

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    #include <File.au3>
    #include <GUIConstantsEx.au3>
    #include<WindowsConstants.au3>
    #include <GuiListView.au3>

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

    Opt('GUIOnEventMode', 1)
    Opt('MustDeclareVars', 1)

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

    Local $hMainGui = GUICreate("Artikel",800, 580, 0, 0,BitOR($WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_SIZEBOX))
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')

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

    Global $hlstvwArtikel = GUICtrlCreateListView("Dateiname | Artikelnummer | Datum ", 2, 2, 796, 465,BitOR($LVS_REPORT,$LVS_NOSORTHEADER))
    GUICtrlSetResizing($hlstvwArtikel, $GUI_DOCKBORDERS)
    _einlesen()
    GUISetState()

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

    While 1
    Sleep(120)
    WEnd

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

    Func _End()
    GUIDelete($hMainGui)
    Exit
    EndFunc ;==>_End

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

    func _einlesen()
    Local $file, $line, $vline, $oline, $inhalt, $i, $found
    $file = FileOpen("Ergebnis.txt", 0)
    ; Prüfen, ob Datei eingelesen wurde
    If $file = -1 Then
    MsgBox(0, "Fehler", "Die Datei konnte nicht geöffnet werden.")
    Exit
    EndIf


    ; Zeilen des Textes einlesen bis EOF
    While 1
    $line = FileReadLine($file)
    If @error = -1 Then ExitLoop
    $line = StringReplace($line,",","|")
    $vline= StringSplit($line,"|")
    $i = 0
    $found = False
    Do
    if _GUICtrlListView_GetItemCount($hlstvwArtikel) = 0 then ExitLoop
    $oline = _GUICtrlListView_GetItemTextArray($hlstvwArtikel,$i)
    if $vline[2] = $oline[2] Then
    $found = True
    if $vline[3] > $oline[3] Then
    _GUICtrlListView_SetItemText($hlstvwArtikel,$i,$vline)
    ExitLoop
    EndIf
    EndIf
    $i = $i + 1
    Until $i > _GUICtrlListView_GetItemCount($hlstvwArtikel) - 1
    if not $found then GUICtrlCreateListViewItem($line,$hlstvwArtikel)
    ; MsgBox(0, "Zeile gelesen:", $line)
    WEnd
    FileClose($file)

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

    EndFunc

    [/autoit]

    , musst du noch testen (gibt Problem wenn Artikel-Nr. 0).

    mfg (Auto)Bert

  • Hallo AutoBert,


    vielen vielen Dank für die Mühe.

    Nur leider muss ich ehrlich zugeben das ich nicht ganz dahintersteig was der Code macht :(


    Folgendes habe ich mittlerweile geschafft:

    Meine TXT Datei ist so wie ich sie brauche, ich möchte eigentlich nur noch folgendes:


    Inhalt der TXT:

    W-8174512.doc,90027,20090116092338
    W-8174513.doc,90028,20090116092412
    W-8174514.doc,90021,20090312101603
    W-8174515.doc,90022,20090312101537
    W-8174516.doc,90023,20090312101514
    W-8174517.doc,90024,20090312101442
    W-8174601.doc,64680-04,20090303091328
    W-8174701.doc,93010,20090113105010
    W-8174702.doc,93010,20081218115337
    W-8174801.doc,73990-60,20090105162626


    Hier habe ich jetzt z.B. die Nr. 93010 doppelt, der Wert dahinter ist das Änderungsdatum.

    Die Zeile "W-8174702.doc,93010,20081218115337" würde ich nun gerne löschen, da die darüber aktueller ist.

    In dieser kurzen TXT Datei ist nun jetzt nur 1 Artikel doppelt, in der "richtigen" werden es viele sein, da muss das Prog anhand des Datums entscheiden welche es behalten soll und die restlichen Zeilen mit der Artnr löschen.


    Wie krieg ich das hin ?


    Jemand einen Tipp ?


    Danke an alle

    • Offizieller Beitrag

    Hi,
    ich hab dir mal 'ne Lösung erstellt (natürlich mit Arrays :D).

    Spoiler anzeigen
    [autoit]

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

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

    Global $path = @ScriptDir & '\test_x.txt'
    Global $aFile, $tmpSplit, $aSplit[_FileCountLines($path)][3], $aIndexDelete[1] = [-1]
    _FileReadToArray($path, $aFile) ; Textdatei in Array einlesen, jede Textzeile in einem Element
    If @error Then Exit MsgBox(0, 'Fehler', 'Datei konnte nicht eingelesen werden')

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

    ; gesamten Dateiinhalt in einem 2D-Array ($aSplit) darstellen
    For $i = 1 To UBound($aFile) -1
    $tmpSplit = StringSplit($aFile[$i], ',', 2)
    If @error Then ContinueLoop ; falls Leerzeile
    For $j = 0 To 2
    $aSplit[$i-1][$j] = $tmpSplit[$j]
    Next
    Next
    ;~ _ArrayDisplay($aSplit)

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

    ; sortieren nach Version
    _ArraySort($aSplit, 1, 0, 0, 1)
    ;~ _ArrayDisplay($aSplit, 'sortiert')

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

    ; bei mehrfacher Versionsnummer die älteren zum Löschen vormerken
    Local $new = -1
    For $i = 0 To UBound($aSplit) -1
    If $aSplit[$i][1] <> $new Then
    $new = $aSplit[$i][1]
    Else
    If $aIndexDelete[UBound($aIndexDelete)-1] <> -1 Then ReDim $aIndexDelete[UBound($aIndexDelete)+1]
    If $aSplit[$i][2] < $aSplit[$i-1][2] Then ; Datum kleiner als im vorigen Eintrag gleicher Version
    ; wenn noch nicht zum Löschen vermerkt ==> eintragen
    _ArraySearch($aIndexDelete, $i)
    If @error Then $aIndexDelete[UBound($aIndexDelete)-1] = $i
    Else
    _ArraySearch($aIndexDelete, $i-1)
    If @error Then $aIndexDelete[UBound($aIndexDelete)-1] = $i-1
    EndIf
    EndIf
    Next
    ;~ _ArrayDisplay($aIndexDelete)

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

    ; anhand der Lösch-Indexe die Einträge im Array löschen, ABER rückwärts, da sonst die Indexe nicht mehr stimmen!
    For $i = UBound($aIndexDelete) -1 To 0 Step -1
    _ArrayDelete($aSplit, $aIndexDelete[$i])
    Next
    ;~ _ArrayDisplay($aSplit, 'bereinigt')

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

    ; zurückschreiben in Datei
    Local $strWrite = ''
    For $i = 0 To UBound($aSplit) -1
    For $j = 0 To 2
    $strWrite &= $aSplit[$i][$j] & ','
    Next
    $strWrite = StringTrimRight($strWrite, 1) & @CRLF
    Next
    Local $fh = FileOpen($path, 2)
    FileWrite($fh, StringTrimRight($strWrite, 2))
    FileClose($fh)

    [/autoit]
  • Hallo Bugfix,


    uuhh, krass, ne Menge Code. Werde mir das mal zu Gemüte führen.


    Vielen Dank für deine Mühe.

  • Hallo Bugfix,


    eine kleine Frage noch:


    ich versuche mit StringRegExp nach folgendem Muster zu suchen und zwar:

    -[Zahl 0-9][Zahl 0-9].doc --> also z.B. W-81734-34.doc (-34.doc)

    Habs mit '-[0-9][0-9]\.doc' probiert --> aber leider Fehler

    Diese will ich noch aus der TXT Datei löschen (die Funktion dafür hab ich schon.)


    Nur krieg ich diese Platzhalter nicht hin


    Kleiner Tipp ?


    Vielen Dank

  • Hallo Bugfix,


    habe deine Lösung probiert und funzt super.

    Versteh zwar nicht ganz wie das tickt, aber erste Sahne.


    Muss wohl ein bisschen mehr mit AutoIT üben um das zu verstehen.


    Ganz großer Dank an Dich.

    • Offizieller Beitrag

    ich versuche mit StringRegExp nach folgendem Muster zu suchen und zwar:
    -[Zahl 0-9][Zahl 0-9].doc --> also z.B. W-81734-34.doc (-34.doc)


    Das wäre das passende Pattern dazu: "W-\d+-\d+\.doc"

    Bei der Lösung zum Finden der Doppel bin ich (anhand der Musterdatei) davon ausgegangen, dass neuere Versionsinformationen immer am Dateianfang eingefügt werden.
    Falls die Möglichkeit besteht, dass mehr als 2 gleiche Dateien auftauchen und diese irgendwo in der Datei eingeschrieben werden, müßte man zweistufig sortieren, um definitiv die jüngste Datei zu erwischen. Vielleicht sogar generell der bessere Weg. Vielleicht erstelle ich diese Lösung mal noch. ;)

    Edit:
    Habe die Lösung mal abgeändert mit mehrstufiger Sortierung. Nun können beliebig viele Dateien derselben Version irgendwo in der Datei stehen: Es wird nur die neueste rausgefischt. ;)

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Array.au3>
    #include <SQLite.au3>
    #include <SQLite.dll.au3>

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

    Global $path = @ScriptDir & '\test_x.txt'
    Global $aFile, $tmpSplit, $aSplit[_FileCountLines($path)][3], $aIndexDelete[1] = [-1]
    _FileReadToArray($path, $aFile) ; Textdatei in Array einlesen, jede Textzeile in einem Element
    If @error Then Exit MsgBox(0, 'Fehler', 'Datei konnte nicht eingelesen werden')

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

    ; gesamten Dateiinhalt in einem 2D-Array ($aSplit) darstellen
    For $i = 1 To UBound($aFile) -1
    $tmpSplit = StringSplit($aFile[$i], ',', 2)
    If @error Then ContinueLoop ; falls Leerzeile
    For $j = 0 To 2
    $aSplit[$i-1][$j] = $tmpSplit[$j]
    Next
    Next
    ;~ _ArrayDisplay($aSplit, 'unsortiert')

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

    ; sortieren nach Version und innerhalb der Version nach Datum
    _Array2DSortFree($aSplit, "1|1,2|1")
    ;~ _ArrayDisplay($aSplit, 'sortiert 2-stufig')

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

    ; bei mehrfacher Versionsnummer die älteren zum Löschen vormerken
    Local $new = -1
    For $i = 0 To UBound($aSplit) -1
    If $aSplit[$i][1] <> $new Then
    $new = $aSplit[$i][1]
    Else ; jedes weitere Vorkommen ist aufgrund der Sortierung älter ==> Löschen
    If $aIndexDelete[UBound($aIndexDelete)-1] <> -1 Then ReDim $aIndexDelete[UBound($aIndexDelete)+1]
    $aIndexDelete[UBound($aIndexDelete)-1] = $i
    EndIf
    Next
    ;~ _ArrayDisplay($aIndexDelete)

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

    ; anhand der Lösch-Indexe die Einträge im Array löschen, ABER rückwärts, da sonst die Indexe nicht mehr stimmen!
    For $i = UBound($aIndexDelete) -1 To 0 Step -1
    _ArrayDelete($aSplit, $aIndexDelete[$i])
    Next
    ;~ _ArrayDisplay($aSplit, 'bereinigt')

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

    ; zurückschreiben in Datei
    Local $strWrite = ''
    For $i = 0 To UBound($aSplit) -1
    For $j = 0 To 2
    $strWrite &= $aSplit[$i][$j] & ','
    Next
    $strWrite = StringTrimRight($strWrite, 1) & @CRLF
    Next
    Local $fh = FileOpen($path, 2)
    FileWrite($fh, StringTrimRight($strWrite, 2))

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

    ;==================================================================================================
    ; Function Name: _Array2DSortFree($ARRAY, $sCOL_ASC [, $NUM=False])
    ; Description:: Sortierung von 1D/2D-Arrays nach freier Wahl
    ; 1D Sortierung Auf- oder Absteigend
    ; 2D mehrstufige Sortierung, Reihenfolge und Sortier-
    ; richtung (je Spalte) frei wählbar
    ; auch einzelne Spalte sortierbar
    ; Parameter(s): $ARRAY Das zu sortierende Array
    ; $sCOL_ASC String mit Sortierangaben "Spalte|Richtung [, Spalte|Richtung]"
    ; zu sortierende Spalte (0-Index)|Richtung (0-Asc, 1-Desc)
    ; z.B. Spalte 2 aufsteigend und in 2 absteigend Spalte 1
    ; _Array2DSortFree($ar2Sort, '1|0,0|1')
    ; optional $NUM "False" sortiert alphabetisch (Standard), "True" sortiert numerisch
    ; Return Value(s): Erfolg 0
    ; Fehler 1 Set Error 1 $ARRAY ist kein Array
    ; 2 1D-Array, aber Spaltenangabe für 2D
    ; 3 SQL-Fehler
    ; 4 Angaben für Spalte|Sortierrichtung fehlerhaft
    ; Requirements: #include <SQLite.au3>
    ; #include <SQLite.dll.au3>
    ; #include <Array.au3>
    ; Note: Es ist dringend erforderlich, die SQLite-Includes am Beginn des aufrufenden
    ; Skriptes auszuführen. Anderenfalls schlägt die Initialisierung der SQLite.dll
    ; durch _SQLite_Startup() fehl.
    ; Version: 3.3.0.0
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    #include-once
    #include <SQLite.au3>
    #include <SQLite.dll.au3>
    #include <Array.au3>
    Func _Array2DSortFree(ByRef $ARRAY, $sCOL_ASC, $NUM=False)
    If Not IsArray($ARRAY) Then Return SetError(1,0,1)
    Local $tableStr = "CREATE TABLE [tblTEST] ("
    Local $insertStr = '', $insertBase = "INSERT INTO tblTEST VALUES ("
    Local $sortOrder = '', $sortStr = "SELECT * FROM tblTEST ORDER BY "
    Local $aResult, $asc, $iRows, $iCol
    $sCOL_ASC = StringStripWS($sCOL_ASC, 8)
    Local $ub2nd = UBound($ARRAY, 2)
    If @error = 2 Then
    If (StringLen($sCOL_ASC) > 3) Or (StringLeft($sCOL_ASC, 1) <> '0') Then Return SetError(2,0,1)
    If StringRight($sCOL_ASC, 1) = 0 Then
    _ArraySort($ARRAY)
    Else
    _ArraySort($ARRAY, 1)
    EndIf
    Return 0
    Else
    Local $aOut[UBound($ARRAY)][$ub2nd]
    EndIf
    _SQLite_Startup ()
    If @error > 0 Then Return SetError(3,0,1)
    $hSQL = _SQLite_Open ()
    If @error > 0 Then
    _SQLite_Shutdown ()
    Return SetError(3,0,1)
    EndIf
    For $i = 0 To UBound($ARRAY, 2) -1
    $tableStr &= "'field" & $i & "',"
    Next
    $tableStr = StringTrimRight($tableStr, 1) & ");"
    For $i = 0 To UBound($ARRAY) -1
    $insertStr &= $insertBase
    For $k = 0 To UBound($ARRAY, 2) -1
    $insertStr &= "'" & $ARRAY[$i][$k] & "',"
    Next
    $insertStr = StringTrimRight($insertStr, 1) & ");"
    Next
    If _SQLite_Exec ( $hSQL, $tableStr & $insertStr ) <> $SQLITE_OK Then
    _SQLite_Shutdown ()
    Return SetError(3,0,1)
    EndIf
    If StringInStr($sCOL_ASC, ',') Then
    Local $aOrder = StringSplit($sCOL_ASC, ',')
    For $i = 1 To UBound($aOrder) -1
    If StringInStr($sCOL_ASC, '|') Then
    Local $var = StringSplit($aOrder[$i], '|')
    $asc = ' ASC'
    If $var[2] = 1 Then $asc = ' DESC'
    If $NUM Then
    $sortOrder &= 'ABS(field' & $var[1] & ')' & $asc & ','
    Else
    $sortOrder &= 'field' & $var[1] & $asc & ','
    EndIf
    Else
    _SQLite_Shutdown ()
    Return SetError(4,0,1)
    EndIf
    Next
    $sortOrder = StringTrimRight($sortOrder, 1) & ';'
    Else
    If (StringLen($sCOL_ASC) > 2) And (StringInStr($sCOL_ASC, '|')) Then
    Local $var = StringSplit($sCOL_ASC, '|')
    $asc = ' ASC'
    If $var[2] = 1 Then $asc = ' DESC'
    If $NUM Then
    $sortOrder &= 'ABS(field' & $var[1] & ')' & $asc
    Else
    $sortOrder &= 'field' & $var[1] & $asc
    EndIf
    Else
    _SQLite_Shutdown ()
    Return SetError(4,0,1)
    EndIf
    EndIf
    If _SQLite_GetTable2d ( $hSQL, $sortStr & $sortOrder, $aResult, $iRows, $iCol ) <> $SQLITE_OK Then
    _SQLite_Shutdown ()
    Return SetError(3,0,1)
    EndIf
    For $i = 1 To UBound($aResult) -1
    For $j = 0 To UBound($ARRAY,2) -1
    $ARRAY[$i-1][$j] = $aResult[$i][$j]
    Next
    Next
    _SQLite_Exec ($hSQL, "DROP TABLE tblTEST;")
    _SQLite_Close ()
    _SQLite_Shutdown ()
    Return 0
    EndFunc ;==>_Array2DSortFree

    [/autoit]
  • Hallo Bugfix,


    mmhh das könnte oder eher wird wahrscheinlich auch so sein, das mehrere Dokumente (größer als 2) vom selben Artikel existieren.

    Die haben oft auch nicht immer die fortlaufende Nummerierung im Dateinamen.


    Danke dir

  • Guten Morgen,


    kann eigentlich die Funktion StringinStr mit Platzhaltern umgehen ?


    Danke

  • Hallo jimewlad,

    wenn du unter Platzhalter * und ? meinst, nein benötigt man auch nicht, dann lässt man bei * alles danach bei der Angabe des substrings weg, bei ? müsste man evtl mehrere StringInStr-Prüfungen nacheinander durchführen. Wenn du ein Beispiel machst, in dem angibst was du hast und wie das Ergebnis sein soll z.B.: String = xyzblaundbla --> Ergebnis soll yzblaund sein, findet sich sicher eine Lösung,

    mfg (Auto)Bert

  • Danke an alle für Eure Antworten.


    Bei einem Problem kann ich mit Stringinstr suchen, das klappt wunderbar.


    Bei der anderen Sache habe ich es mit Stringregexp probiert und dem Pattern W-\d+-\d\.doc (für -12.doc z.B. oder -35.doc ...)

    Aber mit diesem Pattern hat er ein Problem. Ich bekomme immer nur eine 0 zurück, also nie einen Match.


    For $i = 1 To _FileCountLines(@ScriptDir & "\Ergebnis.txt")
    $readline = FileReadLine($rfile, $i)
    $stringCount = stringregexp($readline,"W-\d+-\d\.doc",0)

  • Hallo


    wie kann ich denn 2 Spalten in einem Array löschen ?


    Mein Array hat 3 Spalten: Col 0, Col 1 und Col2


    Col0 und Col2 werden nicht gebraucht. Diese würde ich gerne aus dem Array komplett löschen.


    Geht das ?

  • Die 3 Spalten kommen automatisch ins Array, da ich diese von einer TXT Datei einlese.


    Wollte nun die 2 Spalte aus diesem Array in ein 1D Array kopieren.

    Aber er kopiert Zeile 1 von Spalte 1, 2 +3 statt der gesamten Spalte 2


    Spoiler anzeigen
    [autoit]

    Dim $cArray[Ubound($aSplit, 2)]
    For $i = 0 To Ubound($aSplit, 2)-1
    $cArray[$i] = $aSplit[1][$i]
    Next

    [/autoit]


    Sehe aber den Fehler nicht ?


    Edit: Habs gefunden


    Spoiler anzeigen
    [autoit]

    Dim $cArray[Ubound($aSplit, 1)]
    For $j = 0 To Ubound($aSplit, 1) -1
    $cArray[$j] = $aSplit[$j][1]
    Next

    [/autoit]

    Einmal editiert, zuletzt von jmewald (12. Mai 2009 um 14:35)