Introduction
我有一个CSV文件,其中每个字段都包含一个双引号("
)。每行中的最后一个字段是JSON字符串表示形式。我想编写一个PHP脚本来解析CSV文件,然后解析JSON字符串。这就是我现在所拥有的。
while (($line = fgetcsv($handle, 1000000, ";", '"')) !== false)
{
// Another loop to loop over the fields
// ...
parse_json(end($line));
}
private function parse_json($json_string)
{
if (!empty($json_string))
{
$json = json_decode($json_string, true);
$msg = sprintf("The following description is not in proper JSON format: %s", $json_string);
if (is_null($json))
{
// The function json_decode returns null if the string is not properly JSON formatted.
throw new Exception($msg);
}
}
}
在CSV文件中的下面一行中,我在PHP中得到了以下数组。
"A";"B";"C";"D";"E";;"{""Name"":""Richard B Mephisto""}"
array ('Name' => 'Richard B Mephisto');
问题描述
当我想在JSON字符串的一个值中允许双引号时,麻烦就开始了。对于JSON,我需要用反斜杠转义双引号,而对于CSV,我需要用另一个双引号来转义双引号。如果我想要下面的数组,CSV文件和解析器应该是什么样的呢?
array ('Name' => 'Richard "B" Mephisto');
失败了
1)在CSV文件中使用下面一行。
"A";"B";"C";"D";"E";;"{""Name"":""""Richard B Mephisto""""}"
在解析JSON时,在调用json_decode
之前,将每个""
替换为一个/"
。在这种情况下,这是可行的,但我也需要允许空字符串。
"A";"B";"C";"D";"E";;"{""Name"":""}"
这些问题也将被这一解决办法所取代。
2)在CSV文件中使用反斜杠。原则上,JSON字符串应该如下所示:
{"Name": "Richard \"B\" Mephisto"}
因此,我尝试在CSV文件中这样做:
"A";"B";"C";"D";"E";;"{""Name"":\""Richard B Mephisto\""}"
其结果是:
以下描述不符合JSON格式:{"JSON_key":"Richard \“B\”Mephisto""}“
不知怎么的,它没有与转义字符和双引号一起正常工作。
3)逃避CSV中的反斜杠。
"A";"B";"C";"D";"E";;"{""JSON_key"":""Richard \\""B\\"" Mephisto""}"
结果:
The following description is not in proper JSON format: {"JSON_key":"Richard \\"B\\" Mephisto"}
发布于 2015-07-06 13:29:11
试试这个:
$in = '"A";"B";"C";"D";"E";;"{""Name"":""Richard \""B\"" Mephisto""}";"{""Name"":""""}"';
$out = str_getcsv($in, ';', '"', '"');
var_dump($out);
结果:
array(8) {
[0]=>
string(1) "A"
[1]=>
string(1) "B"
[2]=>
string(1) "C"
[3]=>
string(1) "D"
[4]=>
string(1) "E"
[5]=>
string(0) ""
[6]=>
string(33) "{"Name":"Richard \"B\" Mephisto"}"
[7]=>
string(11) "{"Name":""}"
}
https://stackoverflow.com/questions/31246550
复制相似问题