doppler in mehreren csv Dateien

  • Hallo,
    ich habe mal wieder ein kleines "doppler Problem".
    Mal sehen ob ich es gut beschreiben kann, also:

    Es gibt drei .csv Dateien (Listentrennzeichen "|")

    auftrag.csv
    protokoll.csv (>20.000 Zeilen)
    neuauftrag.csv

    In der ersten "Spalte" einer jeden .csv Datei gibt es eine eindeutige Auftr.Nr die als Kriterium für eine doppelte Zeile
    verwendet werden soll.
    Ist also die erste Zahl vor der ersten Trennung mit "|" gleich, dann handelt es sich um einen "doppler", egal was danach in der Zeile steht.

    Hier mal ein Beispiel wie die .csv Dateien aufgebaut sind.

    auftrag.csv

    Code
    4444|ac|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|
    5555|aaa|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|
    6666|aca|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|

    protokoll.csv

    Code
    1111|ac|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|
    2222|aca|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|
    3333|aaa|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|

    neuauftrag.csv

    Code
    1111|aaa|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|
    7777|aca|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|
    8888|aaa|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|
    9999|aca|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|

    Jetzt soll folgendes Untersucht und in einer ergebnis.csv gespeichert werden:

    Wenn Auftr.Nr von (neuauftrag.csv) in: auftrag.csv & protokoll.csv vorhanden, dann nicht in ergebnis.csv eintragen, anders eintragen.

    In meinem Beispiel müßte die ergebnis.csv also so aussehen:

    ergebnis.csv

    Code
    7777|aca|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|
    8888|aaa|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|
    9999|aca|bbb|ccc|ddd|eee|fff|ggg|hhh|iii|

    Vielleicht kann mir ja jemand dabei helfen?

    Einmal editiert, zuletzt von Jensen.. (6. August 2014 um 17:11)

    • Offizieller Beitrag

    Ich würde ein Dictionary-Objekt verwenden, weil das bei solchen Vergleichen sehr viel schneller ist, als wenn man Arrays durchlaufen muss.
    So würde es mit den obigen Daten funktionieren:

    Spoiler anzeigen
    [autoit]


    Global $sKey, $sVal, $iFound, $sErgebnis = ''

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

    Global $oDictAuftrag = ObjCreate('Scripting.Dictionary')
    Global $aAuftrag = StringSplit(FileRead(@ScriptDir & '\auftrag.csv'), @CRLF, 1)
    For $i = 1 To $aAuftrag[0]
    $iFound = StringInStr($aAuftrag[$i], '|')
    $sKey = StringLeft($aAuftrag[$i], $iFound - 1)
    $sVal = StringMid($aAuftrag[$i], $iFound + 1)
    $oDictAuftrag.Add($sKey, $sVal)
    Next

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

    Global $oDictProtokoll = ObjCreate('Scripting.Dictionary')
    Global $aProtokoll = StringSplit(FileRead(@ScriptDir & '\protokoll.csv'), @CRLF, 1)
    For $i = 1 To $aProtokoll[0]
    $iFound = StringInStr($aProtokoll[$i], '|')
    $sKey = StringLeft($aProtokoll[$i], $iFound - 1)
    $sVal = StringMid($aProtokoll[$i], $iFound + 1)
    $oDictProtokoll.Add($sKey, $sVal)
    Next

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

    Global $aNeuAuftrag = StringSplit(FileRead(@ScriptDir & '\neuauftrag.csv'), @CRLF, 1)
    For $i = 1 To $aNeuAuftrag[0]
    $iFound = StringInStr($aNeuAuftrag[$i], '|')
    $sKey = StringLeft($aNeuAuftrag[$i], $iFound - 1)
    If Not $oDictAuftrag.Exists($sKey) And Not $oDictProtokoll.Exists($sKey) Then $sErgebnis &= $aNeuAuftrag[$i] & @CRLF
    Next
    Global $hFile = FileOpen(@ScriptDir & '\ergebnis.csv', 2)
    If $hFile <> -1 Then
    FileWrite($hFile, $sErgebnis)
    FileClose($hFile)
    EndIf
    ConsoleWrite($sErgebnis & @CR)

    [/autoit]
  • ***perfekt Oscar und super schnell ist es auch noch***

    und mit deinem Listview Datenbank Beispiel kombiniert ergibt das nun eine kleine aber effektive Auftragsverwaltung.

    DANKE :thumbup: