Ankündigung

Einklappen
Keine Ankündigung bisher.

gleiche Einträge ignorieren

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    array_unique funktioniert nicht, weil CSV-Felder auch Zeilenumbrüche enthalten dürfen. Das mag in Verbindung mit file eine Lösung sein, aber es ist keine Lösung.

    Kommentar


    • #17
      Ich habe mir mal erlaubt, die Testdaten so (um zwei Citroen-Zeilen) zu erweitern, dass sie sinnvoll für den Anwendungsfall sind, wie ich ihn verstanden habe.

      Das ist aber wirklich eine Aufgabe, die man als Fragesteller selbst übernehmen darf. Ich musste zweimal fragen, und dann waren die Daten immer noch nicht wirklich doll. Leute, bitte. Denkt mit! Wir sind hier definitiv in der Lage, euch bei so überschaubaren Sachen zu helfen, aber es ist ziemlich öde, wenn man sich das dann selbst noch zusammendichten darf. Welche Ausgabe du genau willst, hast du noch immer nicht als Beispiel gepostet. Ich habe es hier jetzt mal so implementiert, wie ich es verstanden habe. Wie gesagt: Eine durchdachte Beispielausgabe ist im Zweifel eine sehr gute Ergänzung zu einer wörtlichen Beschreibung. Man sieht dann, was Sache ist.

      PHP-Code:
      <?php

      $csvFile 
      = <<<'EOT'
      Bergfeld;1;0;4;Citroen;AG 2451;;;;;;;;;;;;;;;;;;;;;;;;;;
      Grüze;1;0;4;Toyota;AG 2563;;;;;;;;;;;;;;;;;;;;;;;;;;
      Grüze;1;0;5;Audi;AG 4698563;;;;;;;;;;;;;;;;;;;;;;;;;;
      Seefeld;1;0;4;Citroen;AG 2452;;;;;;;;;;;;;;;;;;;;;;;;;;
      Stettbach;1;0;5;Lancia;AG 985642;;;;;;;;;;;;;;;;;;;;;;;;;;
      Seen;1;0;4;VW;AG 1200560;;;;;;;;;;;;;;;;;;;;;;;;;;
      Seen;1;0;4;Ford;AG 5526620;;;;;;;;;;;;;;;;;;;;;;;;;;
      Waldfeld;1;0;4;Citroen;AG 2453;;;;;;;;;;;;;;;;;;;;;;;;;;
      EOT;

      $handle fopen('data://text/plain;base64,' base64_encode($csvFile), 'rb');
              
      // Kann auch eine Datei sein. Habe ich nur für das Beispiel inline
              // geschrieben. Siehe: http://php.net/manual/en/wrappers.data.php

      $data = array();

      while (
      $row fgetcsv($handle0';')) {
          
      $data[] = $row;
      }

      // Sortiert
      // 1. Nach der Spalte mit Toyota, Audi und so
      // 2. Nach Autonummer (Spalte danach, ABER ALS STRING, NICHT ALS ZAHL)
      usort($data, function ($a$b) {
          
      $tmp strcmp($a[4], $b[4]);

          if (
      $tmp !== 0) {
              return 
      $tmp;
          }

          return 
      strcmp($a[5], $b[5]);
      });

      foreach (
      $data as $d) {
          
      printf("%s\n"implode('.'$d));
      }

      // Grüze.1.0.5.Audi.AG 4698563..........................
      // Bergfeld.1.0.4.Citroen.AG 2451..........................
      // Seefeld.1.0.4.Citroen.AG 2452..........................
      // Waldfeld.1.0.4.Citroen.AG 2453..........................
      // Seen.1.0.4.Ford.AG 5526620..........................
      // Stettbach.1.0.5.Lancia.AG 985642..........................
      // Grüze.1.0.4.Toyota.AG 2563..........................
      // Seen.1.0.4.VW.AG 1200560..........................



      // Ausgabe nach Automarke gruppiert:

      $groupByColumn = function ($data$columnIndex) {
          
      $grouped = array();

          foreach (
      $data as $d) {
              if (!
      array_key_exists($d[$columnIndex], $grouped)) {
                  
      $grouped[$d[$columnIndex]] = array();
              }

              
      $grouped[$d[$columnIndex]][] = $d;
          }

          return 
      $grouped;
      };

      foreach (
      $groupByColumn($data4) as $key => $value) {
          
      printf("%s\n"$key);

          foreach (
      $value as $v) {
              
      printf(" - %s\n"implode('.'$v));
          }
      }

      // Audi
      //  - Grüze.1.0.5.Audi.AG 4698563..........................
      // Citroen
      //  - Bergfeld.1.0.4.Citroen.AG 2451..........................
      //  - Seefeld.1.0.4.Citroen.AG 2452..........................
      //  - Waldfeld.1.0.4.Citroen.AG 2453..........................
      // Ford
      //  - Seen.1.0.4.Ford.AG 5526620..........................
      // Lancia
      //  - Stettbach.1.0.5.Lancia.AG 985642..........................
      // Toyota
      //  - Grüze.1.0.4.Toyota.AG 2563..........................
      // VW
      //  - Seen.1.0.4.VW.AG 1200560..........................
      (Fürs Protokoll: Das ist in der Form nicht unbedingt deterministisch (also, es wird keine eindeutige Ordnung bei übereinstimmenden Vergleichskriterien gebildet), weil die Reihenfolge, in der usort Items vergleicht, meines Wissens nicht spezifiziert ist. Für Determiniertheit müsste – zum Beispiel – noch so etwas wie ein Primärschlüssel für einen Datensatz existieren, nach dem bei sonstiger Gleichheit sortiert werden könnte. Den sehe ich hier nicht. Das ist aber für das gewünschte Resultat vermutlich eher irrelevant.)

      Kommentar


      • #18
        Ganz herzlichen Dank für die Hilfe.
        Ich habe das nun zwei Stunden probiert, aber irgendetwas mache ich noch immer falsch. Es kommt immer Fehlermeldung, dass die 5 und 4 undefined offset seien:
        Ich habe nun mal die Automarken schon getrennt. Das funktioniert. Wie kann ich nun aber in diesem Code noch die Autonummern sortieren?
        PHP-Code:
        <?php


        if (($handle fopen("daten.csv""r")) !== FALSE) {
                
        fgets($handle);     // Erste Zeile überlesen
            
        while (($data fgetcsv($handle1000",")) !== FALSE) {
                    
        // $data= array();
                  
        echo "\n";
                       
        if (
        $data[4]=='Citroen') { 
           
             echo 
        "<table width=800> <td width=70>$data[1]</td><td width=70>$data[2] </td> <td width=30>$data[3] </td> <td width=30>$data[4]</td> <td width=90>$data[5] </td> </table> ";
                }
          
            }
            
        fclose($handle);
        }

        ?>
        Die Ausgabe:
        Citroen AG 2569
        Citroen AG 1268
        Citroen AG 589642

        Hier möchte ich noch nach Nummern sortieren. Könnte sonst AG auch weglassen, wenn es dann besser ginge. Wie mache ich das nun im obigen Code?

        Vielen Dank für eure Geduld!

        Kommentar


        • #19
          Hallo zusammen.
          Ich bin leider immer noch nicht weiter. Ich versuchte den ganzen Tag die Lösung von mermshaus einzubauen, aber ich schaffe es nicht.
          Ich habe wenigstens geschafft, dass die Array Warnung nicht mehr kommt, aber ich möchte doch nur nach der 5. Spalte sortieren, aber das schaffe ich einfach nicht. Mein Code:
          PHP-Code:
          <?php

          if (($handle fopen("daten.csv""r")) !== FALSE) {
              while ((
          $data fgetcsv($handle1000",")) !== FALSE) {
                    echo 
          "\n";
                         
          $var=array($data[5]);
                   
          ksort ($var);

          if (
          $data[4]=='Citroen') { 
             
               echo 
          "<table width=800> <td width=70>$data[1]</td><td width=70>$data[2] </td> <td width=30>$data[3] </td> <td width=30>$data[4]</td> <td width=90>$var </td> </table> ";
                  }
                }
              
          fclose($handle);
          }

          ?>
          Für var_dump gibt es nun aus: array(1) { [0]=> string(5) "54628" }. Aber sie werden nicht sortiert. Woran kann das liegen?
          Vielen Dank für eure Hilfe!

          Kommentar


          • #20
            Du kannst die CSV erst mal in eine sqlite-inMemory-Tabelle ziehen und da dann deine Anforderung umsetzen:

            PHP-Code:
            $pdo = new PDO('sqlite::memory:');
            $pdo->exec('CREATE TABLE tabelle ...');
            $stmt $pdo->prepare('INSERT INTO tabelle (feld1, feld2, feld3, feld4, ...) VALUES (?, ?, ?, ?, ...)');

            $file = new SplFileObject("data.csv");
            while (!
            $file->eof()) {
                
            $fields $file->fgetcsv(',''"');
                
            $stmt->execute($fields);
            }

            /* ... */ 
            Index-setzen nicht vergessen.

            Kommentar


            • #21
              habe ich nun auch probiert. Stöhn. Ihr vergesst etwas, dass ich Anfänger bin??
              Es gibt offenbar keine einfache Lösung?

              Kommentar


              • #22
                Bin nun wieder einen Schritt weiter, aber ich komme einfach nicht zum richtigen Schluss:
                PHP-Code:
                <?php

                if (($handle fopen("daten.csv""r")) !== FALSE) {
                    while ((
                $data fgetcsv($handle1000",")) !== FALSE) {
                          echo 
                "\n";
                               
                $var=array($data[5]);
                usort($var"strnatcmp");

                var_dump ($var[0]); echo '<p>'// ergibt z.B. string(5) "45685"
                var_dump ($var); echo '<p>';  // ergibt z.B.  array(1) { [0]=> string(5) "45685" }
                echo ($var[0]); // ergibt z.B. 45685

                if ($data[4]=='Citroen') { 
                   
                     echo 
                "<table width=800> <td width=70>$data[1]</td><td width=70>$data[2] </td> <td width=30>$data[3] </td> <td width=30>$data[4]</td> <td width=90>$var </td> </table> ";
                        }
                      }
                    
                fclose($handle);
                }

                ?>
                Ich habe nun also wenigstens einen array, wenn er einen array braucht. Aber wie kann ich $var[0] sortieren?

                Kommentar


                • #23
                  Zitat von ChristianK Beitrag anzeigen
                  Nimm eine Datenbank dazwischen.

                  Btw. Arrays notiert man so: $array[$i] nicht so $array{$i} !
                  Ich zitiere mich gerne selber.

                  Halte dich an den Post von mermshaus, wenn du das in PHP machen willst. Das übersteigt deine Kompetenzen jedoch vermutlich. Deshalb empfehle ich dir, eine temporäre Tabelle zu nutzen wie von rkr vorgeschlagen und die Datenbank sortieren zu lassen. Das ist einfacher.
                  [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                  Kommentar

                  Lädt...
                  X