我需要解析一个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
)
答案 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
的工作原理 - 假设您已经将
fgetcsv
将是实现两者的正确功能......但是它对文件而不是字符串数据进行操作。如果你将字符串数据“写”到临时文件或内存中,那么PHP的各种流可能会以某种方式提供帮助,这样你就可以实际使用fopen
来获得fgetcsv
可以工作的可读流有...这个问题可以让你了解这是如何运作的:how to use fgetcsv with strings
答案 3 :(得分:0)
似乎str_getcsv()
不允许在字符串字段中使用换行符,并且不按行检查换行,而不检查新行是否在字段中。有必要使用与此功能不同的东西,它只是效果不好。
我发现直接解析CSV而无需解析的代码就是来自用户str_getcsv()
的{{1}}函数的man page行。所有缺失的是它不使用第一行的值作为其他行的键。