PHP fgetcsv 和自定义行结束字符

PHP fgetcsv and a custom line ending character

我正在使用 php 导入一个 csv,由于 csv 有时可能很大,我通过使用以下代码一次流式传输 4096 字节的文件来这样做:

if(($handle = fopen($file, 'r')) !== false)
    {
        // loop through the file line-by-line
        while(($data = fgetcsv($handle)) !== false)
        {
            echo var_dump($data);
            unset($data);
        }
        fclose($handle);
    }
    else
    {
        echo "unable to open file $file <br>";
    }

一些 csvs 有一个非标准的行结束符 ';'并且我需要能够手动指定结束行,以便 fgetcsv 正确获取 csv 的每一行。

我已阅读建议使用 ini 设置的其他解决方案:

ini_set("auto_detect_line_endings", true);

但这并没有解决我遇到的问题。

此问题的先前解决方案是获取整个文件并修改所有非标准行结尾并将其替换为回车 return 和换行符。由于 csvs 的大小增加,此解决方案不再有效。

我在 var 转储中得到的是 csv 的所有行,而不是 csv 的一行。 CSV 中的示例行:

"col1,col2,col3,col4,col5;col1,col2,col3,col4,col5;col1,col2,col3,col4,col5;"

由于 fgetcsv() 没有更改行尾的工具,您可以选择使用 stream_get_line() up to the delimiter, and then parse the line with str_getcsv()

读取文件
// Given a delimiter...
$delimiter = ";";

if(($handle = fopen($file, 'r')) !== false) {
  // Read the line up to the delimiter
  while ($line = stream_get_line($handle, 4096, $delimiter)) {
    // Parse the CSV line into an array
    $data = str_getcsv($line);
    var_dump($data);
  }
  fclose($handle);
}