Ich habe es mal mit _ArrayUnique getestet, er löscht zwar bis auf eine Zeile alle doppelten, jedoch benutzt diese Funktion den gesamten Datensatz um einen Vergleich zu machen.
Ich möchte aber das er Datensätze löscht die in der ersten "Spalte" gleich sind.
Hier das Script mit _ArrayUnique
Spoiler anzeigen
#include <array.au3>
#include <file.au3>
Global $file= @ScriptDir & "\test.csv"
_deldoppler()
[/autoit] [autoit][/autoit] [autoit]Func _deldoppler()
Dim $adata
_FileReadToArray($file, $adata)
_ArrayDisplay($adata)
$aNewArray = _ArrayUnique($adata)
_ArrayDisplay($aNewArray)
;_FileWriteFromArray($file, $aNewArray, 2)
FileClose($file)
EndFunc
So sah die test.csv vor den umwandeln aus:
1111|aaa|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|jjj
1111|aca|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|jjj
2222|aaa|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|jjj
2222|aca|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|jjj
2222|aca|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|jjj
danach so:
1111|aaa|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|jjj
1111|aca|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|jjj
2222|aaa|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|jjj
2222|aca|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|jjj
so sollte sie aber aussehen:
EDIT:
Ich habe jetzt versucht das "Dictionary" Script von AspirinJunkie für meine Bedürfnisse anzupassen, für meine kleine test.csv funktioniert das nun.
Aber vielleicht kann ja nochmal jemand drüber schauen ob das so auch vernünftig ist.
Spoiler anzeigen
#include <array.au3>
#include <file.au3>
Global $sFile= @ScriptDir & "\test.csv"
Global $sFile_out= @ScriptDir & "\fertig.csv"
_dopplerfinden()
[/autoit] [autoit][/autoit] [autoit]Func _dopplerfinden()
Global $dic_CSV1 = ObjCreate("Scripting.Dictionary") ; Ein Dictionary als Zwischenspeicher da es sich schneller durchsuchen lässt als ein Array
Global $s_Key, $s_Out = "" ; $s_Out = zu schreibendes Endergebnis
Const $s_CSV1 = $sFile ;test.csv"
Const $s_CSVOut = $sFile_out ;ergebnis.csv"
For $s_Line In FileReadToArray($s_CSV1) ; erste Datei zeilenweise durchgehen
$s_Key = StringLeft($s_Line, StringInStr($s_Line, "|")) ; erste Spalte auslesen
$dic_CSV1($s_Key) = $s_Line ; erste Spalte als Key und ganze Zeile als Value in das Dictionary eintragen
Next
[/autoit] [autoit][/autoit] [autoit]If $dic_CSV1.Exists($s_Key) Then ; Check ob der erste "Spaltenwert" in der CSV vorhanden war
$dic_CSV1.Remove($s_Key) ; Falls ja diesen Wert aus Dictionary löschen
EndIf
$s_Out &= $s_Line & @CRLF ; Zeile zu $s_Out hinzufügen
For $s_Key in $dic_CSV1.Keys() ; Alle Keys des Dictionarys durchgehen
$s_Out &= $dic_CSV1($s_Key) & @CRLF ; Die mit den Keys verknüpften Daten (=die Zeilen) $s_Out ebenfalls noch hinzufügen
Next
; $s_Out in Datei schreiben:
FileDelete($s_CSVOut)
FileDelete($sFile)
FileWrite($sFile, StringTrimRight($s_Out, 2)) ; StringTrimRight um letztes unnötiges @CRLF zu entfernen
EndFunc
[/autoit]