str_getcsv()不会忽略引用的新行

时间:2017-08-21 11:27:40

标签: php string csv parsing

我需要解析一个CSV字符串,在第一步中,我想从中获取行。我使用str_getcsv函数来执行此操作,但即使在最基本的情况下它似乎也会失败 - 由引号括起来的新行。

$rows = '7;"Hi
";3';
$array = str_getcsv($rows,"\n",'"');
print_r($array);

结果应该是只有一个值的数组,但我有两个 - 令人惊讶的是引用的新行是......

result:
Array
(
    [0] => 7;"Hi
    [1] => ;3
)

我做错了什么?

编辑: 很奇怪,但是当我尝试时

$rows = '7;"Hi
";3
8;Hello;6';

结果是

Array
(
    [0] => 7;"Hi
    [1] => ;3
8;Hello;6
)

4 个答案:

答案 0 :(得分:0)

PHP似乎不允许列数据中的换行符。你可以解决这个问题:

$row = '7;"Hi'.PHP_EOL.'";3'; 
$row=str_replace(PHP_EOL,"\0",$row); 
$array = str_getcsv($row,"\n",'"');
$array = array_map(function ($v) {
   return str_replace("\0",PHP_EOL,$v);
},$array);
print_r($array);

Array
(
    [0] => 7;"Hi
";3
)

答案 1 :(得分:0)

继续

php -v PHP 5.6.30(cli)(建于2017年2月7日16:18:37)

php > $row = "\"abc\"\n;\"def\"\n;\"123\"";
php > $array = str_getcsv($row,"\n",'"');
php > print_r($array);
Array
(
    [0] => abc
    [1] => ;"def"
    [2] => ;"123"
)

和这个

php > $row = "\"abc\"\n\"def\"\n\"123\"";
php > 
php > 
php > $array = str_getcsv($row,"\n",'"');
php > print_r($array);
Array
(
    [0] => abc
    [1] => def
    [2] => 123
)

等(所有其他情况)。

你的var语句中的分隔符中可能有另一个符号,区别于\ n或\ r或\ r \ n?

答案 2 :(得分:0)

  

我做错了什么?

您使用错误的参数调用了该函数...

http://php.net/manual/en/function.str-getcsv.php

  

定界符
  设置字段分隔符(仅限一个字符)。

第二个参数是字段分隔符,即;,而不是换行符。

$rows = '7;"Hi
";3';
$array = str_getcsv($rows,';','"');
var_dump($array);

// output:
array(3) {
  [0]=>
  string(1) "7"
  [1]=>
  string(4) "Hi
"
  [2]=>
  string(1) "3"
}

编辑:

  

结果应该是只有一个值的数组

为什么一个值?你应该在这里的实际字段分隔符是什么?我假设它是; ...但是如果你希望从显示的示例输入中只获得一个值,那么分隔符是什么?或者它甚至是CSV ......?

第二次编辑:

  

首先我需要获取行 - 字段分隔符是换行符

这并不是str_getcsv的工作原理 - 假设您已经将只有一行的CSV数据作为输入字符串。并且你不能真正使用像换行符这样简单的爆炸来“获取”单行 - 因为换行符也可以在字段内。

fgetcsv将是实现两者的正确功能......但是它对文件而不是字符串数据进行操作。如果你将字符串数据“写”到临时文件或内存中,那么PHP的各种流可能会以某种方式提供帮助,这样你就可以实际使用fopen来获得fgetcsv可以工作的可读流有...这个问题可以让你了解这是如何运作的:how to use fgetcsv with strings

答案 3 :(得分:0)

似乎str_getcsv()不允许在字符串字段中使用换行符,并且不按行检查换行,而不检查新行是否在字段中。有必要使用与此功能不同的东西,它只是效果不好。

我发现直接解析CSV而无需解析的代码就是来自用户str_getcsv()的{​​{1}}函数的man page行。所有缺失的是它不使用第一行的值作为其他行的键。