Dateien oder Arrays vergleichen und bestimmte Zeilen zusammenführen.

  • Hey Leute!

    Ich würde gerne wissen, wie man vorgeht, wenn man Dateien oder Arrays vergleicht und wie man sie zusammenführt (wie der Titel schon sagt :D ).
    Also fogendes Szenario hab ich hier:

    Eine kleine Datei mit einer ID und Infos
    1234 TAB 1 TAB Info1
    1235 TAB 2 TAB Info2
    1376 TAB 3 TAB Info3

    und eine große Datei mit mit unter anderem den gleichen IDs. Manchmal fehlt aber eine ID.
    1221 TAB 1 TAB InfoA
    1222 TAB 2 TAB InfoB
    1235 TAB 3 TAB InfoC
    ........ TAB 4 TAB InfoD
    ........ TAB 5 TAB InfoE
    1375 TAB 11 TAB InfoF
    1376 TAB 12 TAB InfoG

    Ich würde jetzt gerne die Infos der ersten Datei mit denen der zweiten Datei zusammenführen.

    In diesem Bsp.:
    Info1 TAB Keine Infos vorhanden
    Info2 TAB InfoC
    Info3 TAB InfoG

    Es handelt sich um durch Tabs getrennte Daten. Ich möchte am Ende in einer GUI z.B. Info2 und InfoC in angeben können. Dafür müsste ich aber erst diesen Schritt bewältigen. Bisher habe ich nichts gefunden, das mir mit meinem geringen Kenntnisstand so weit geholfen hat, dass ich die Lösung sehen würde.

    Ich muss dazu sagen, ich erstelle die Dateien in einigen Schritten vorher und könnte da schon anders vorgehen, wenn es angebracht wäre.

    Grüße autoiter

    Einmal editiert, zuletzt von autoiter (22. März 2014 um 19:06)

  • Ich muss dazu sagen, ich erstelle die Dateien in einigen Schritten vorher und könnte da schon anders vorgehen, wenn es angebracht wäre.


    Da du die Dateien selbst erstellst würde ich durchaus vorschlagen das ganze gleich in eine einzige Datei (oder evtl. sogar in eine Datenbank) zu schreiben oder ggf. ganz auf die Datei zu verzichten jenachdem wozu du die Daten brauchst und ob diese nach Programmende noch benötigt werden. Vielleicht solltest du mal deinen kompletten code posten...

    Ansonsten ist das so wie es ist auch kein Problem. Du brauchst nur folgende Funktionen und grundlegende Kenntnisse im Umgang mit Arrays und Schleifen:

    [autoit]


    _filereadtoarray
    Stringsplit
    redim ; ggf zum dynamischen neu Dimensionieren des dritten Arrays, siehe unten

    [/autoit]

    Vorgehensweise sollte eigentlich selbsterklärend sein...

    1. Beide Dateien in separate Arrays einlesen
    2. Zeile(n) innerhalb einer verschachtelten Schleife mit stringsplit in ihre Bestandteile zerlegen (Trennzeichen @TAB)
    3. Jeweils die ID der Zeile des ersten Arrays mit den IDs aller Zeilen aus dem zweiten Array vergleichen
    4. Bei Übereinstimmung der ID jeweils die zugehörigen Infos X und Y in ein drittes 2 dimensionales Array speichern, Aufbau des dritten Arrays: [[ID,InfoX,InfoY]]
    5. Auf Wunsch das 2D Array dann wieder in einen String zerlegen um wie gewünscht per TAB getrennt in eine Datei zu schreiben, Alternativ das Ergebnis gleich in einem String speichern und das dritte Array weglassen...


    Bei fehlendem Wissen bezüglich Arrays: http://www.bug-fix.info/array_tut.htm

  • Das Tut hatte ich mir angesehen. Da du meinst, ich finde meine Antworten da, schaue ich mir das noch mal an.
    Ich muss allerdings zugeben, dass ich mit Arrays noch grundsätzliche Probleme habe. Z.B. von zwei unterschiedlichen Dateien/Arrays einzelne Spalten in eine neue Datei/Array zu schreiben, kriege ich immer noch nicht hin...
    Als ich ausprobiert hab array1[$i][0] <> array2[$i][0] hat das nicht funktioniert..
    Kann sein, dass ich etwas brauch. ICh melde mich wieder bei euch.

    Grüße autoiter

  • Als ich ausprobiert hab array1[$i][0] <> array2[$i][0] hat das nicht funktioniert..


    Ähm naja ich weiß ja nicht wie dein Scriptversuch ausschaut, aber mein Ansatz würde zwei ineinander verschachtelte Schleifen nutzen um beide Arrays miteinander zu vergleichen (bzw. vielmehr die gesplitteten Zeilen der Arrays). Du brauchst also mit meinem Ansatz mindestens zwei Zählervariablen für deine Schleifen. Zweimal die selbe Variable (bei dir $i) nutzen wird natürlich nicht das gewünschte Ergebnis liefern.

    Hier mal evtl. fehlerhafter und unvollständiger pseudocode weil ich zu faul bin dir das ganze Script zu schreiben:


    [autoit]


    $a1 = ...datei 1 einlesen
    $a2 = ...datei 2 einlesen
    global $a3[ubound($a1)][3] ; ergebnis array ist gleich groß wie a1, zumindestens ging das aus deiner Beschreibung hervor...

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

    for $i = 1 to ubound($a1)-1
    $aSplit1 = stringsplit($a1[$i]...@tab...) ; zeile $i aus $a1 gesplittet
    for $j = 1 to ubound($a2)-1
    $aSplit2 = stringsplit($a2[$j]...@tab...) ; zeile $j aus $a2 gesplittet
    if $aSplit1[1] = $aSplit2[1] then ; hier sollte jeweils die id der Zeile beider Arrays stehen, sind diese gleich, dann...
    $a3[$i][0] = $aSplit1[1] ; die ID
    $a3[$i][1] = $aSplit1[3] ; info aus array1
    $a3[$i][2] = $aSplit2[3] ; gefundene info aus array2
    exitloop ; unter der annahme, dass die ID in Array 2 maximal einmal vorkommt, also nie mehr als 2 infos pro ID möglich sind
    endif
    next
    next

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

    _arraydisplay($a3)

    [/autoit]

    Das Script könnte so allerdings abstürzen wenn das Splitten einer Zeile nicht wie gewünscht drei Splitttreffer hat. Du solltest also evtl noch Fehlerabfragen nach dem jeweiligen Zeilensplit einbauen, damit nicht auf nicht existente Arrayindexe zugegriffen wird.

    2 Mal editiert, zuletzt von misterspeed (22. März 2014 um 21:20)

  • Hier mal evtl. fehlerhafter und unvollständiger pseudocode weil ich zu faul bin dir das ganze Script zu schreiben:

    Naja, zu faul.. Du hast mir ja eigentlich das ganze Script geschrieben. Sorry, dass ich mir das komplett vorkauen lasse. Es funktioniert genau so. Ich danke dir dafür.

    Grüße autoiter