当在封闭之前找到转义字符时,str_getcsv无法正确解析数据

时间:2014-11-14 10:43:11

标签: php parsing csv

我需要将csv字符串解析为数组。我正在使用php str_getcsv()它工作正常,直到我发现以下情况。

$line = 'field1,field2,field3,"this is field having backslash at end\",anothersomeval';
$arrField = str_getcsv($line, ",", '"');
echo count($arrField);

所以我预计数量应为5,但实际显示为4。 我为这个问题做了谷歌,但找不到任何适当的解决方案。 我怀疑它是str_getcsv()的问题,虽然我无法找到任何关于此的错误报告。

我需要使用正确的csv解析机制,我不能根据字段分隔符拆分值,或只是爆炸字符串。

有关上述代码出错的任何帮助吗?

3 个答案:

答案 0 :(得分:3)

str_getcsv()的第四个参数设置转义字符;默认转义字符是反斜杠。在你的情况下,你正在逃避doble引用。

如果反斜杠在csv字符串中没有特殊含义,并且您希望将其视为文字字符,请使用不同的转义字符调用str_getcsv(),您可以确保它不会出现在csv中字符串,例如'#',如:

$arrField = str_getcsv($line, ",", '"', '#');
echo count($arrField);
5

答案 1 :(得分:1)

我遇到了同样的问题。我用这个创可贴解决了这个问题,看起来工作得很好,直到有一个选项添加到不使用分隔符的功能。

//messy CSV content
$csvIn = "\"test 1\", \"test 2\", \"test 3\\\", \"test 4\"";

//we will use the ASCII device control 1 character, this should not be in your CSV input
//to make sure it is not, replace all occurrences with an empty string
$csvIn = str_replace("\x11", "", $csvIn);

//convert the csv to array using str_getcsv function and our non-existent delimiter
//make sure the delimiter character is surrounded by double quotes, single quotes will not work
$csvArray = str_getcsv($csvIn, ',', '"', "\x11");

//output the clean results
print_r($csvArray);

答案 2 :(得分:-1)

我不得不说的是@ user2395126解决方案很好。 在评论中,我建议使用不同的方式来定义$ csvIn,使用quote而不是双引号作为字符串分隔符,以避免每个斜杠:

//CSV content with a backslash as last character
$csvIn = '"test 1", "test 2", "test 3\", "test 4"';

解决方案的其余部分应该是@ user2395126。

然后我尝试了另一种方法:在使用str_getcsv()之前,只需转义反斜杠。最后,我们得到一个部分结果,包含一个带有双斜杠而不是单斜杠的数组。最后一步是必要的。

这是我的完整解决方案:

//CSV content with a backslash as last character
$csvIn = '"test 1", "test 2", "test 3\", "test 4"';

// Escape backslashes
$csvIn = str_replace("\\", "\\\\", $csvIn);

$csvArray = str_getcsv($csvIn, ',', '"');

//output partial result, with double slashes
print_r($csvArray);

//replace double slashes with single one
foreach($csvArray as $key => $item) {
  $csvArray[$key] = str_replace("\\\\", "\\", $item);
}

//output the clean results
print_r($csvArray);