Rolf B: csv Datei von Duplikaten befreien / Neue Frage und Antwort

Beitrag lesen

Hallo Pit,

ich habe mal experimentiert - wenn Du die Daten bereits als Array vorliegen hast, ist es am einfachsten, wenn Du sie in eine hierarchische Darstellung überführst.

Damit meine ich ein Array, in dem die Werte von feld2 der Key sind. Jeder Eintrag davon ist ein Array, in dem die Werte von feld3 der Key sind. Und davon ist jeder Eintrag ein Array mit den Zeilen, die diese Wertekombination für feld2 und feld3 haben.

Diese Arrayhierarchie durchläufst Du dann mit foreach und kannst auf jedes Zeilen-Array einen array_unique anwenden. Ist der count für dieses Array dann 1, schreibst Du dafür den CSV Satz. Oder machst sofort den Insert in die real_table und sparst Dir das CSV Geraffel.

Mal angenommen, alle Sätze stehen in einem Array $data.

$data = ARRAY(
    [ "feld1" =>  1, "feld2" => 7, "feld3" => 8, "feld4" => "Mumpf" ],
    [ "feld1" => 17, "feld2" => 4, "feld3" => 9, "feld4" => "Foo" ],
    [ "feld1" => 17, "feld2" => 4, "feld3" => 9, "feld4" => "Foo" ],
    [ "feld1" => 45, "feld2" => 5, "feld3" => 2, "feld4" => "Dings" ],
    [ "feld1" => 46, "feld2" => 5, "feld3" => 2, "feld4" => "Pings" ],
);

Das überführst Du in die genannte Hierarchie. Statt foreach ($data as $row) kann es auch eine while-Schleife sein, die ein SQL Query-Result einliest.

$rowDict = [ ];

foreach ($data as $row) {
   $f2 = $row["feld2"];    // Variablen für Lesbarkeit
   $f3 = $row["feld3"];

   if (empty($rowDict[$f2])) {
      $rowDict[$f2] = [ $f3 => [ $row ] ];
   }   
   else if (empty($rowDict[$f2][$f3])) {
      $rowDict[$f2][$f3] = [ $row ];
   }   
   else {
      $rowDict[$f2][$f3][] = $row;
   }   
}

Die Schleife prüft Stufe für Stufe der Hierarchie, ob es für diese Stufe schon einen Eintrag gibt. Wenn nicht, wird der Eintrag auf dieser Stufe angelegt. Wenn doch, wird die Stufe entsprechend ergänzt.

Das kannst Du nun verarbeiten:

foreach ($rowDict as $f2Dict) {
   foreach ($f2Dict as $rows) {
      $uniqRows = array_unique($rows, SORT_REGULAR);
      if (count($uniqRows) == 1)
         importToDatabase($uniqRows[0]);
      else
         writeDuplicates($uniqRows);
   }
}

importToDatabase kann den CSV Satz schreiben, oder direkt den INSERT machen. Und writeDuplicates kann eine CSV-Datei mit den Duplikaten schreiben, oder sie in eine Tabelle mit den Duplikaten INSERTen. Ganz wie Du willst.

Rolf

--
sumpsi - posui - clusi
0 100

csv Datei von Duplikaten befreien

Pit
  • php
  1. 0
    Auge
    1. 0
      Pit
      1. 0
        Der Martin
  2. 0
    MudGuard
    1. 0
      Pit
  3. 0

    Kommt drauf an...

    Raktenwissenschaftler
    1. 0
      Raketenwissenschaftler
  4. 0

    csv Datei von Duplikaten befreien / Neue Frage

    Pit
    1. 0
      Pit
      1. 0
        Raketenwissenschaftler
        1. 0
          Raketenwissenschaftler
          • sql
        2. 0
          Tabellenkalk
        3. 0
          Rolf B
          1. 0
            Raketenwissenschaftler
          2. 0
            Pit
            • danke
            • php
            1. 0
              Rolf B
              1. 0
                Pit
                1. 0
                  Rolf B
                  1. 0
                    Pit
                    1. 0
                      Rolf B
                      1. 0
                        Pit
                        1. 0
                          Rolf B
                          1. 0
                            Pit
                            1. 0

                              csv Datei von Duplikaten befreien / Neue Frage und Antwort

                              Pit
                              1. 0
                                Rolf B
                                1. 0
                                  Pit
                                  1. 0
                                    Pit
                                    1. 1
                                      Rolf B
                                      1. 0
                                        Pit
                                        1. 0
                                          Rolf B
                                          1. 0
                                            Pit
                                            1. 0
                                              Rolf B
                                              1. 0
                                                Pit
                                            2. 0
                                              Rolf B
                                              1. 0
                                                Pit
                                                1. 0
                                                  Rolf B
                                                  1. 0
                                                    Pit
                                                    1. 0
                                                      Pit
                                                      1. 0
                                                        Raketenwissenschaftler
                                                        1. 0
                                                          Pit
                                                          1. 0
                                                            Raketenwissenschaftler
                                                            1. 0
                                                              Pit
                                                            2. 0
                                                              Rolf B
                                                              1. 0
                                                                Pit
                                                                1. 0
                                                                  Rolf B
                                                                  1. 0
                                                                    Matthias Apsel
                                                                    1. 0
                                                                      Tabellenkalk
                                                                      1. 0
                                                                        MudGuard
                                                                    2. 0
                                                                      Rolf B
                                                                  2. 0
                                                                    Pit
                                                          2. 1
                                                            Felix Riesterer
                                                            • php
                                                            1. 0
                                                              Pit
                                                              1. 0
                                                                Felix Riesterer
                                                                1. 0
                                                                  Pit
                                                                  1. 1

                                                                    NoSQL?

                                                                    Raketenwissenschaftler
                                                                    1. 0

                                                                      NoSQL? (Korrektur)

                                                                      Raketenwissenschaftler
    2. 0
      Raketenwissenschaftler
      1. 0
        Pit
        1. 0
          Raketenwissenschaftler
      2. 0
        Raketenwissenschaftler
    3. 0
      Felix Riesterer
      1. 0
        Pit
        1. 0
          Tabellenkalk
          1. 3
            Raketenwissenschaftler
            1. 2
              Tabellenkalk
        2. 0
          Felix Riesterer
          1. 0
            Pit
    4. 0
      pl
  5. 1

    Kritik an Deinem Umgang mit Hilfe

    Felix Riesterer
    1. 3
      Pit
      1. 1
        Der Martin
        1. 0
          pl
          1. 0
            Tabellenkalk
            1. 0
              Der Martin
            2. 0
              pl
        2. 0

          Zeilenumbruch in einem CSV-Feld

          Linuchs
          • programmiertechnik
          1. 0
            MudGuard
          2. 0
            Der Martin
            1. 0
              Rolf B
              1. 0
                Der Martin
          3. 0
            pl
            1. 0
              Felix Riesterer
              1. 0
                pl
              2. 0
                pl
              3. 1
                Christian Kruse
                1. 0
                  Rolf B
                  1. 0
                    Christian Kruse
                    1. 0
                      Der Martin
                      1. 0
                        Christian Kruse
                        1. 0
                          Der Martin
                    2. 0
                      Rolf B
                      1. 0
                        Christian Kruse
            2. 0
              Rolf B
              1. 0

                Zeilenumbruch in einer textarea

                pl
      2. 0
        Felix Riesterer
      3. 0
        Rolf B
      4. 0
        pl
        1. 0
          pl
      5. 0
        Raketenwissenschaftler