首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用PHP解析带有JSON的CSV

使用PHP解析带有JSON的CSV
EN

Stack Overflow用户
提问于 2015-07-06 12:59:17
回答 1查看 1K关注 0票数 2

Introduction

我有一个CSV文件,其中每个字段都包含一个双引号(")。每行中的最后一个字段是JSON字符串表示形式。我想编写一个PHP脚本来解析CSV文件,然后解析JSON字符串。这就是我现在所拥有的。

代码语言:javascript
运行
复制
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中得到了以下数组。

代码语言:javascript
运行
复制
"A";"B";"C";"D";"E";;"{""Name"":""Richard B Mephisto""}"
array ('Name' => 'Richard B Mephisto');

问题描述

当我想在JSON字符串的一个值中允许双引号时,麻烦就开始了。对于JSON,我需要用反斜杠转义双引号,而对于CSV,我需要用另一个双引号来转义双引号。如果我想要下面的数组,CSV文件和解析器应该是什么样的呢?

代码语言:javascript
运行
复制
array ('Name' => 'Richard "B" Mephisto');

失败了

1)在CSV文件中使用下面一行。

代码语言:javascript
运行
复制
"A";"B";"C";"D";"E";;"{""Name"":""""Richard B Mephisto""""}"

在解析JSON时,在调用json_decode之前,将每个""替换为一个/"。在这种情况下,这是可行的,但我也需要允许空字符串。

代码语言:javascript
运行
复制
"A";"B";"C";"D";"E";;"{""Name"":""}"

这些问题也将被这一解决办法所取代。

2)在CSV文件中使用反斜杠。原则上,JSON字符串应该如下所示:

代码语言:javascript
运行
复制
{"Name": "Richard \"B\" Mephisto"}

因此,我尝试在CSV文件中这样做:

代码语言:javascript
运行
复制
"A";"B";"C";"D";"E";;"{""Name"":\""Richard B Mephisto\""}"

其结果是:

以下描述不符合JSON格式:{"JSON_key":"Richard \“B\”Mephisto""}“

不知怎么的,它没有与转义字符和双引号一起正常工作。

3)逃避CSV中的反斜杠。

代码语言:javascript
运行
复制
"A";"B";"C";"D";"E";;"{""JSON_key"":""Richard \\""B\\"" Mephisto""}"

结果:

代码语言:javascript
运行
复制
The following description is not in proper JSON format: {"JSON_key":"Richard \\"B\\" Mephisto"}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-06 13:29:11

试试这个:

代码语言:javascript
运行
复制
$in = '"A";"B";"C";"D";"E";;"{""Name"":""Richard \""B\"" Mephisto""}";"{""Name"":""""}"';
$out = str_getcsv($in, ';', '"', '"'); 
var_dump($out);

结果:

代码语言:javascript
运行
复制
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":""}"
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31246550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档