Inhalt von 2 Dateien zusammen führen, nach Duplikaten suchen und löschen

  • 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
    [autoit]

    #include <array.au3>
    #include <file.au3>
    Global $file= @ScriptDir & "\test.csv"

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

    _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

    [/autoit]

    So sah die test.csv vor den umwandeln aus:

    Code
    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:

    Code
    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:

    Code
    1111|aaa|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|jjj
    2222|aaa|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|jjj


    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
    [autoit]

    #include <array.au3>
    #include <file.au3>
    Global $sFile= @ScriptDir & "\test.csv"
    Global $sFile_out= @ScriptDir & "\fertig.csv"

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

    _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"

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

    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

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

    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

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

    EndIf
    $s_Out &= $s_Line & @CRLF ; Zeile zu $s_Out hinzufügen

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

    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

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

    ; $s_Out in Datei schreiben:
    FileDelete($s_CSVOut)
    FileDelete($sFile)
    FileWrite($sFile, StringTrimRight($s_Out, 2)) ; StringTrimRight um letztes unnötiges @CRLF zu entfernen

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

    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von Jensen.. (25. Juli 2014 um 03:41)