Ich habe festgestellt, dass nicht den ersten Wert in doppelte Anführungszeichen eingeschlossen, auch wenn die Zeichenfolge Daten auf diese Weise übergeben wird.str_getcsv umschließt die erste Spalte in doppelten Anführungszeichen nicht im CSV-Format
In dem folgenden Beispiel ist der erste Wert in der dritten Zeile "Small Box, But Smaller"
, aber nachdem er durchlaufen hat, wird er Small Box, But Smaller
(ohne doppelte Anführungszeichen). Wie folgt aus:
// multi-line csv string
$csvString = <<<'CSV'
"Title","Description",Quantity
"Small Box","For storing magic beans.",2
"Small Box, But Smaller","Not sure why we need this.",0
CSV;
// split string into rows (don't use explode in case multi-line values exist)
$csvRows = str_getcsv($csvString, "\n"); // parse rows
echo '<pre>';
print_r($csvRows);
echo '</pre>';
Ausgänge:
Array
(
[0] => Title,"Description",Quantity
[1] => Small Box,"For storing magic beans.",2
[2] => Small Box, But Smaller,"Not sure why we need this.",0
)
Das Problem verursacht dies ist, dass jetzt, wenn jede Zeile analysiert wird mit str_getcsv
, ein Komma in dem ersten Wert macht es in zwei Reihen aufgeteilt. Wenn es hält dies ausgeführt wird:
foreach($csvRows as &$csvRow) {
$csvRow = str_getcsv($csvRow); // parse each row into values and save over original array value
}
unset($csvRow); // clean up
// output
echo '<pre>';
print_r($csvRows);
echo '</pre>';
Ausgänge:
Array
(
[0] => Array
(
[0] => Title
[1] => Description
[2] => Quantity
)
[1] => Array
(
[0] => Small Box
[1] => For storing magic beans.
[2] => 2
)
[2] => Array
(
[0] => Small Box
[1] => But Smaller
[2] => Not sure why we need this.
[3] => 0
)
)
Das Problem ist in dem letzten Array-Wert, der ein Array von 4 Tasten statt 3. Es ist auf dem Komma des Wertes geteilt "Small Box, But Smaller"
.
Auf der anderen Seite, das Parsen nur eine Zeile String funktioniert:
$csvRowData = '"Small Box, But Smaller","Not sure why we need this.",0';
$csvValues = str_getcsv($csvRowData);
echo '<pre>';
print_r($csvValues);
echo '</pre>';
Ausgänge:
Array
(
[0] => Small Box, But Smaller
[1] => Not sure why we need this.
[2] => 0
)
Warum ist das passiert und wie löse ich das Problem mit mehrzeiligen CSV-Daten? Gibt es eine bewährte Methode zum Arbeiten mit CSV-Daten mit mehreren Zeilen, wenn es sich um eine Zeichenfolge handelt und nicht direkt aus einer Datei gelesen wird? Außerdem muss ich mehrzeilige Werte behandeln, wie zum Beispiel "foo \n bar"
, so dass ich nicht einfach explode()
statt der ersten str_getcsv()
verwenden kann.
Wenn ich 'explode (PHP_EOL, $ csvString)' verwenden würde, würde es auf mehrzeilige Werte aufgeteilt werden. Für meinen Server ist PHP_EOL '\ n' und das Newline-Zeichen in meiner CSV-Datei ist auch' \ n'. – Anton
In diesem Fall sollten Sie wahrscheinlich darauf hinweisen, dass einige Ihrer CSV-Werte Zeilenumbrüche enthalten können. – Phil
Warum sollte ich 'str_getcsv' nicht verwenden, um in Zeilen zu teilen? Gibt es eine Alternative? Und 'explode()' wird nicht funktionieren. Zum Beispiel, wenn ich diese Zeile habe: '" Hallo Welt "," foo \ n bar "', mit 'explode()' würde es in zwei Zeilen, rechts unten den Wert von '" foo \ n bar "' – Anton