DPhil: Nach bestimmten Vorkommen in großer CSV suchen

Hallo zusammen,

ich habe mal eine konzeptionelle Frage. Ich habe eine Produkt-CSV-Datei mit ca. 5.000 Einträgen.

Ziel ist es, über ein Webformular nach einem Produktnamen zu suchen und als Ergebnis die zugehörigen Informationen auszuwerfen. Pro Zeile enthält die CSV Datei einen Datensatz mit 3 Informationen, durch Kommas separiert.

Es steht keine SQL oder noSQL Lösung zur Verfügung.

Mein Ansatz wäre nun folgender:

  1. Bereitstellung der Produktinformationen im JSON Format auf dem Server
  2. Anfrage vom Client mittels AJAX auf dem Server
  3. Gefundene Ergebnisse werden an den Client geliefert und auisgegeben

Ist diese Vorgehensweise vom Grundsatz her sinnvoll oder habe ich hier was vollkommen falsch verstanden?

Danke für die Hinweise...

Phil

  1. Hallo,

    Ich habe eine Produkt-CSV-Datei mit ca. 5.000 Einträgen.

    Ist das eine einmalige Angelegenheit, oder wird diese CSV-Datei immer mal wieder neu erstellt?

    Ziel ist es, über ein Webformular nach einem Produktnamen zu suchen und als Ergebnis die zugehörigen Informationen auszuwerfen. Pro Zeile enthält die CSV Datei einen Datensatz mit 3 Informationen, durch Kommas separiert.

    Im Prinzip kann PHP mit CSV umgehen.

    Es steht keine SQL oder noSQL Lösung zur Verfügung.

    Im Prinzip ist das eine Aufgabe für eine DB.

    Mein Ansatz wäre nun folgender:

    1. Bereitstellung der Produktinformationen im JSON Format auf dem Server
    2. Anfrage vom Client mittels AJAX auf dem Server
    3. Gefundene Ergebnisse werden an den Client geliefert und auisgegeben

    Ist diese Vorgehensweise vom Grundsatz her sinnvoll oder habe ich hier was vollkommen falsch verstanden?

    Das sieht erstmal ok aus, aber JSON != CSV

    Gruß
    Kalk

    1. Hallo Kalk,

      Hallo,

      Ich habe eine Produkt-CSV-Datei mit ca. 5.000 Einträgen.

      Ist das eine einmalige Angelegenheit, oder wird diese CSV-Datei immer mal wieder neu erstellt?

      Die Datei wird ab und an erweitert.

      Ziel ist es, über ein Webformular nach einem Produktnamen zu suchen und als Ergebnis die zugehörigen Informationen auszuwerfen. Pro Zeile enthält die CSV Datei einen Datensatz mit 3 Informationen, durch Kommas separiert.

      Im Prinzip kann PHP mit CSV umgehen.

      Es steht keine SQL oder noSQL Lösung zur Verfügung.

      Im Prinzip ist das eine Aufgabe für eine DB.

      Ja, ich würde das auch bevorzugen.

      Mein Ansatz wäre nun folgender:

      1. Bereitstellung der Produktinformationen im JSON Format auf dem Server
      2. Anfrage vom Client mittels AJAX auf dem Server
      3. Gefundene Ergebnisse werden an den Client geliefert und auisgegeben

      Ist diese Vorgehensweise vom Grundsatz her sinnvoll oder habe ich hier was vollkommen falsch verstanden?

      Das sieht erstmal ok aus, aber JSON != CSV

      Die Konvertierung in JSON wäre dann ein überflüssiger Schritt?

      Gruß
      Kalk

      Danke und Gruß

      Phil

  2. Hallo DPhil,

    1. Bereitstellung der Produktinformationen im JSON Format auf dem Server

    Das würde ich mir überlegen. CSV kann problemlos zeilenweise geparsed werden, will heissen, du musst nicht die komplette Datei durchgehen bevor du suchen kannst, jeder CSV-Parser kann das. Bei JSON sieht das etwas anders aus.

    LG,
    CK

    1. Hallo CK,

      Hallo DPhil,

      1. Bereitstellung der Produktinformationen im JSON Format auf dem Server

      Das würde ich mir überlegen. CSV kann problemlos zeilenweise geparsed werden, will heissen, du musst nicht die komplette Datei durchgehen bevor du suchen kannst, jeder CSV-Parser kann das. Bei JSON sieht das etwas anders aus.

      Möglicherweise kommt ein Produktname mehrfach mit unterschiedlichen Informationen vor. Oder es wird nach Artikelnummern gesucht, die unter Umständen mehrach vergeben sind. Die Datei müsste also komplett durchgeparsed werden.

      Ist das zeilenweise parsen der CSV auch bei größeren Datenmengen (max. 20.000 Zeilen) noch performant oder wäre hierfür die Vorgehendweise völlig daneben?

      LG,
      CK

      --
      > CK kennt Wayne Vielen Dank Phil

      Vielen Dank

      Phil

      1. Hallo DPhil,

        Das würde ich mir überlegen. CSV kann problemlos zeilenweise geparsed werden, will heissen, du musst nicht die komplette Datei durchgehen bevor du suchen kannst, jeder CSV-Parser kann das. Bei JSON sieht das etwas anders aus.

        Möglicherweise kommt ein Produktname mehrfach mit unterschiedlichen Informationen vor. Oder es wird nach Artikelnummern gesucht, die unter Umständen mehrach vergeben sind. Die Datei müsste also komplett durchgeparsed werden.

        Ja, aber du kannst die Zeilen, die du nicht brauchst, verwerfen und musst nicht die ganze Datei im Speicher halten.

        Ist das zeilenweise parsen der CSV auch bei größeren Datenmengen (max. 20.000 Zeilen) noch performant oder wäre hierfür die Vorgehendweise völlig daneben?

        Ich halte es für sinnvoller hier Zeilenweise vorzugehen als die ganze Datei im Speicher zu halten. Aber bei 20k Zeilen wirst du natürlich eine gewisse Zeit brauchen um das durchzuackern.

        LG,
        CK

      2. Moin!

        Ist das zeilenweise parsen der CSV auch bei größeren Datenmengen (max. 20.000 Zeilen) noch performant oder wäre hierfür die Vorgehendweise völlig daneben?

        Es könnte sich lohnen, ab einer bestimmten Größe/Zeilenanzahl Spezialisten wie grep in einer subshell ranzulassen. Wo diese liegt ist schlecht zu sagen, weil das von sehr vielen Umständen abhängt. Aber bei 20.000 Zeilen würde ich das testen wollen.

        Jörg Reinholz

  3. 20.000 Zeilen sind nicht viel.

    Beispielsweise dauert eine mit Perl auf die Datei UnicodeData.txt aufgesetzte Volltextsuche mit Text::Query ungefär 200ms je nach System (gesamte Antwortzeit der Suche über eine Webanwendung).

    Die Datei: UnicodeData.txt hat aktuell eine Größe von 1.4 MB und 25.000 Zeilen als CSV. Das Unicode-Konsortium publiziert diese Datei.

    --Dag

  4. Hallo Phil, Warum noch JSON? da ich vor kurzem etwas ähnliches umgesetzt hatte, eine kurze Info dazu. Meine Intranet Anwendung sucht in einer CSV mit ca. 10 000 Einträgen (original 50 000, aber gesplittet) nach Werten innerhalb der CSV. Ich lese die CSV ein mit;

    while (($csv_line = fgetcsv($fp, filesize("meine.csv"), ";")) !== FALSE)//CSV mit Semikolon
    ..
    

    Danach kannst du die einzelnen "Spalten" gezielt ansprechen wie etwa $csv_line[0], $csv_line[1]..

    Event. noch aufpassen wegen der Codierung der CSV und wegen BOM!

    Gruss hawk