如何在PHP中解析具有列中多行数据的csv

Erg*_*gec 15 php csv parsing

考虑像这样的CSV文件

item1,"description 1"
item2,"description 2"
item3,"description 3
description 3 continues on new line"
item4,"description 4"
Run Code Online (Sandbox Code Playgroud)

哪个应该像这样解析

item1,"description 1"
item2,"description 2"
item3,"description 3 description 3 continues on new line"
item4,"description 4"
Run Code Online (Sandbox Code Playgroud)

有没有办法在PHP中解析具有多行值的CSV?

Sta*_*eyD 11

以下是一些如何做的工作示例.我正在使用fgetcsv:

字符串变量$ CsvString中的CSV:

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

文件中的CSV:

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


dec*_*eze 9

fgetcsv应该能够正确地解析这个.
无论如何,我不建议手动执行此操作,解析CSV时有很多这样的问题.

  • 问题是我使用fgets读取行从文件然后str_getcsv解析字符串而不是仅使用fgetcsv.单行列工作正常但不是多行列.即使是强硬的PHP.net也说fgetcsv"从文件获取行"似​​乎这里的"行"不是纯文本文件中的实际行,而是包含所有多行数据的整个实际行. (2认同)

ori*_*dam 8

基于StanleyD的答案,但使用临时内存块(而不是写入磁盘)以获得更好的性能:

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