So analysieren Sie CSV in PHP mit mehrzeiligen Daten in einer Spalte

Lesezeit: 3 Minuten

Betrachten Sie eine CSV-Datei wie diese

item1,"description 1"
item2,"description 2"
item3,"description 3
description 3 continues on new line"
item4,"description 4"

was so geparst werden sollte

item1,"description 1"
item2,"description 2"
item3,"description 3 description 3 continues on new line"
item4,"description 4"

Gibt es eine Möglichkeit, diese CSV in PHP mit mehrzeiligen Werten zu analysieren?

  • @goreSplatter, oder verwende einfach einen vorhandenen.

    – Bart Kiers

    19. Januar 2011 um 8:18 Uhr

  • @Bart Entschuldigung, ich habe die andere offensichtliche Lösung ausgelassen.

    – Linus Kleen

    19. Januar 2011 um 8:21 Uhr

  • mögliches Duplikat der Parse-CSV-Datei php

    – aussen

    26. Dezember 2011 um 7:36 Uhr

Hier sind einige Arbeitsbeispiele, wie es geht. Ich verwende fgetcsv:

CSV in String-Variable $CsvString:

$fp = tmpfile();
fwrite($fp, $CsvString);
rewind($fp); //rewind to process CSV
while (($row = fgetcsv($fp, 0)) !== FALSE) {
    print_r($row);
}

CSV in Datei:

if (($handle = fopen("test.csv", "r")) !== FALSE) {
  while (($row = fgetcsv($handle, 0, ",")) !== FALSE) {
    print_r($row);
  }
  fclose($handle);
}

  • Ausgezeichnete Antwort. Ich habe CSVs vom Benutzer mit \r-Zeilenenden hochgeladen (ich habe keine Ahnung warum) und musste vor dem Analysieren von CSV strreplace. Da str_getcsv nicht mehrere Zeilen verarbeitet und einige Zeilen neue Zeilen enthalten, funktioniert dies (während es hackisch ist, Dinge in eine temporäre Datei zu stecken, nur damit PHP sie parst).

    – csga5000

    30. Mai 2015 um 21:30 Uhr

fgetcsv sollte in der Lage sein, dies richtig zu analysieren.
Ich würde sowieso nicht empfehlen, dies von Hand zu tun, es gibt viele solcher Fallstricke beim Parsen von CSV.

  • Das Problem ist, dass ich fgets read line from file dann str_getcsv verwendet habe, um die Zeichenfolge zu analysieren, anstatt nur fgetcsv zu verwenden. Es funktionierte gut mit einzeiligen Spalten, aber nicht mit mehrzeiligen. Sogar hartes PHP.net sagt, dass fgetcsv “Gets line from file” scheint, dass “line” hier nicht die tatsächliche Zeile in der Nur-Text-Datei ist, sondern die gesamte tatsächliche Zeile mit allen mehrzeiligen Daten.

    – Ergec

    19. Januar 2011 um 12:50 Uhr

  • Ich bin heute mit dem gleichen Thema gekommen und habe ein wenig gemacht Prüfungdas beweist deine Aussage über Linien in Bezug auf csv-Zeilen und nicht zu tatsächlich Dateizeilen.

    – Raul

    25. März 2013 um 12:22 Uhr


  • Ich hatte gehofft zu verwenden str_getcsv da nicht die gesamte Datei in den Speicher geladen werden muss, sondern nur die Zeile, die rot ist. fgetcsv funktioniert mit mehrzeiligen CSV-Feldern, aber str_getcsv offenbar nicht.

    – Erfan

    19. Dezember 2018 um 3:33 Uhr


  • @Erfan fgetcsv liest auch nur jeweils eine Zeile aus einem geöffneten Dateihandle …!?

    – verzeihen

    19. Dezember 2018 um 6:26 Uhr

Benutzer-Avatar
Oriadam

Basierend auf der Antwort von StanleyD, aber Verwendung eines temporären Speicherblocks (anstatt auf die Festplatte zu schreiben) für eine bessere Leistung:

$fp = fopen('php://temp','r+');
fwrite($fp, $CsvString);
rewind($fp); //rewind to process CSV
while (($row = fgetcsv($fp, 0)) !== FALSE) {
    print_r($row);
}

Hier ist eine schnelle und einfache Lösung mit der PHP-Funktion str_getcsv()

Hier ist ein Beispiel:

function parse_csv( $filename_or_text, $delimiter=",", $enclosure=""", $linebreak="\n" )
{
    $return = array();
    
    if(false !== ($csv = (filter_var($filename_or_text, FILTER_VALIDATE_URL) ? file_get_contents($filename_or_text) : $filename_or_text)))
    {
        $csv = trim($csv);
        $csv = mb_convert_encoding($csv, 'UTF-16LE');   
        
        foreach(str_getcsv($csv, $linebreak, $enclosure) as $row){
            $col = str_getcsv($row, $delimiter, $enclosure);
            $col = array_map('trim', $col);
            $return[] = $col;
        }
    }
    else
    {
        throw new \Exception('Can not open the file.');
        $return = false;
    }
    
    return $return;
}

Stellen Sie sich eine Situation vor, in der Sie eine Funktion benötigen, die sowohl mit URL als auch mit kommagetrenntem Text funktioniert. Das ist genau die Funktion, die so funktioniert. Fügen Sie einfach eine CSV-URL oder einen kommagetrennten Text ein und es funktioniert gut.

1031320cookie-checkSo analysieren Sie CSV in PHP mit mehrzeiligen Daten in einer Spalte

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy