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

  • gleiche Einträge ignorieren

    Hallo zusammen
    Nun habe ich schon neue Frage, die ich leider mit googeln nicht lösen kann:
    Ich möchte aus einem CSV nur immer die Zelle ausgeben, wenn sie einen neuen Inhalt hat.
    Das ginge mit mySQL mit distinct. Wie heisst der Befehl für ein simples CSV ohne Datenbank?

    Vielen Dank!

  • #2
    Einfach so geht das nicht. Dafür musst du die Zeilen manuell vergleichen.
    [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


    • #3
      wie meinst du das?

      Kommentar


      • #4
        CSV ist kein Datenbanksystem sondern einfach "nur" eine Datei die Daten enthält. Eine solche Funktion wie bei MySQL gibt es daher nicht!

        Jetzt hast du zwei Möglichkeiten:
        * Importiere die Daten in eine MySQL-Datenbank um die Boardfunktionen und den ggf. vorhandenen Performance-Vorteil zu nutzen
        * Lese die CSV aus und vergleiche die Daten so wie du Sie brauchst manuell im Script
        Gruß,
        SebTM

        Kommentar


        • #5
          Und wie genau kann ich die Daten manuell vergleichen? Sorry, stecke da immer noch..

          Kommentar


          • #6
            In Pseudocode grob so:

            Code:
            zeileAktiv = array()
            
            Für jede Zeile…
                Wenn ist_nicht_gleich(Zeile, zeileAktiv)…
                    Neue Zeile gefunden. Irgendwas damit tun
                    zeileAktiv = Zeile
            Einlesen per fgetcsv.

            - http://php.net/manual/en/function.fgetcsv.php

            Kommentar


            • #7
              Vielen Dank!
              Nun geht es aber nur darum, dass das ganze mit einer Spalte verglichen werden soll. Wenn der String dieser Spalte schon vorkommt, dann überspring die Linie.
              Das Problem ist irgendwie, dass $zeile ist ein array. Wenn ich aber $zeile[3] auswähle, dann ist es ein String. Wie kann ich das verhindern? Ich möchte ja im Prinzip auch nach dieser Spalte $zeile[3] sortieren können.

              Kommentar


              • #8
                Zeig vielleicht mal Beispieldaten, deinen bisherigen Versuch und das erwünschte Ergebnis. Ich verstehe nicht so recht, was du machen willst, glaube ich.

                Kommentar


                • #9
                  Hello mermshaus. Vielen Dank, dass du dich meinem Problem annimmst! Ich bin schon ziemlich am Verzweifeln.
                  Ich möchte eigentlich zwei Dinge:
                  1. Zuerst nach einer Spalte sortieren, aber jede Automarke nur einmal anzeigen.
                  2. eine andere Spalte (Autonummer) der Grösse nach sortieren.

                  für 1. habe ich das so versucht:
                  PHP-Code:
                  if (($handle fopen("daten.csv""r")) !== FALSE) {     
                      while ((
                  $data fgetcsv($handle1000",")) !== FALSE) {
                   
                  $num count($data);
                            echo 
                  "\n";
                  echo 
                  $data[4];
                     
                  fclose($handle);
                  }

                  Für 2. stecke ich hier fest:
                  PHP-Code:
                   ksort ($data{5}); 
                  Es ist mir bewusst, dass der Array $data heisst, aber ich möchte nach der Spalte 5 sortieren. Wie bringe ich das fertig?

                  Ganz herzlichen Dank für die Hilfe!

                  Kommentar


                  • #10
                    Zitat von ChristianK Beitrag anzeigen
                    Einfach so geht das nicht. Dafür musst du die Zeilen manuell [vergleichen] sortieren.
                    Nimm eine Datenbank dazwischen.

                    Btw. Arrays notiert man so: $array[$i] nicht so $array{$i} !
                    [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


                    • #11
                      Hallöchen,

                      wenn "gleiche Einträge" heißt, dass die Zeilen identisch sind, dann kannst du auch mit array_unique arbeiten und diese herausfiltern.

                      Die Sortierung kannst du mit usort durchführen.

                      Viele Grüße,
                      lotti
                      [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

                      Kommentar


                      • #12
                        hm. Datenbank ist halt schon recht umständlich. Ich möchste das Tool auf verschiedenen Compis laufen lassen, da wäre ohne DB deutlich praktischer...
                        Array: Ja da habe ich Fehler abgeschrieben (weil ich das mal so probiert habe), aber auch mit $array[5] funktioniert es nicht:
                        Fehlermeldung:
                        ksort() expects parameter 1 to be array, string given
                        Mir ist klar dass der Array $data heisst, aber wie bekomme ich nur nach Spalte 5 sortiert?

                        Kommentar


                        • #13
                          Testdaten (CSV) zu #9 wären noch ganz nett und eine tatsächliche Darstellung der erwarteten Ausgabe ist meist auch sehr hilfreich.

                          Zitat von lottikarotti
                          wenn "gleiche Einträge" heißt, dass die Zeilen identisch sind, dann kannst du auch mit array_unique arbeiten und diese herausfiltern.
                          Das funktioniert hier nicht (jedenfalls nicht unmittelbar), weil array_unique (meines Wissens zumindest) keine Unter-Arrays vergleichen kann, die wir aber haben, weil es CSV ist.

                          Kommentar


                          • #14
                            #11 habe ich vorhin gar nicht gesehen, sorry.
                            Habe nun also mit
                            array_unique($data[4]) probiert:
                            Meldung: array_unique() expects parameter 1 to be array, string given
                            Und usort($data[5])
                            liefert: usort() expects exactly 2 parameters, 1 given

                            Und hier die daten.csv-Datei:
                            Code:
                            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;;;;;;;;;;;;;;;;;;;;;;;;;;

                            Kommentar


                            • #15
                              Hallo,

                              geht es dir nur um gesamt gleiche Zeilen oder um Zeilen in der mindestens eine Spalte identisch sind?

                              Wenn es um gleiche Zeilen (also Zeilen die im Gesamten gleich sind geht) wäre mein Ansatz folgender:
                              PHP-Code:
                              // Einlesen der Datei in ein Array -> jede Zeile ist quasi ein eigenes Element!
                              $csvFile file('my.csv');

                              // Anwenden von "array_unique" auf das vorher erhaltene Array
                              $csvUnique array_unique($csvFile);

                              // Erstellen einer Funktion die via "array_map" auf alle Elemente in dem Array angewendet werden kann
                              function parseLineFromCSV($line) {
                                  return 
                              str_getcsv($line);
                              }

                              // aufrufen von "array_map"
                              $csvLinesParsed array_map('parseLineFromCSV'$csvUnique); 
                              ---

                              array_unique($data[4]) probiert:
                              Meldung: array_unique() expects parameter 1 to be array, string given
                              Du übergibst scheinbar nur eine Zeile der Datei - nicht das Array mit allen Zeilen!

                              Und usort($data[5])
                              liefert: usort() expects exactly 2 parameters, 1 given
                              Du übergibst nur einen Parameter (wahrscheinlich auch noch einen String statt einem Array) - es fehlt ein zweiter - welcher siehe Doku!
                              Gruß,
                              SebTM

                              Kommentar

                              Lädt...
                              X