我需要将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解析机制,我不能根据字段分隔符拆分值,或只是爆炸字符串。
有关上述代码出错的任何帮助吗?
答案 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);