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
#include <File.au3>
#include <Array.au3>
#include <SQLite.au3>
#include <SQLite.dll.au3>
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')
; 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')
; sortieren nach Version und innerhalb der Version nach Datum
_Array2DSortFree($aSplit, "1|1,2|1")
;~ _ArrayDisplay($aSplit, 'sortiert 2-stufig')
; 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)
; 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')
; 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))
;==================================================================================================
; 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, ![]()
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