将大型JSON文件中的值转换为CSV

时间:2017-11-20 17:54:02

标签: php json csv

首先,我感谢有很多关于处理大型JSON文件的答案。但是,我还没有找到遇到我的情景的那个。

我面临的问题是我有大型JSON文件(12mb),如下所示:

{
  "range": "Sheet1!A1:P40571", 
  "majorDimension": "ROWS",
  "values": [
    [
      "new_id",
      "qty",
      "total_job_cost",
      "total_job_revenue",
      "total_job_profit",
      "total_job_margin"
    ],
    [
      "34244",
      "5",
      "211.25",
      "297.00",
      "85.75",
      "28.87%"
    ],
    [
      "34244",
      "10",
      "211.25",
      "297.00",
      "85.75",
      "28.87%"
    ],
    ...
  ]
}

我希望提取出值数组,然后将其转换为想要的csv:

new_id,total_job_cost,total_job_revenue,total_job_profit,total_job_margin
34244,211.25,297.00,85.75,28.87%
34245,211.25,297.00,85.75,28.87%
...

但是,由于values数组太大,当我尝试使用PHP库提取它进行JSON解析时,我的服务器在尝试读取它时会崩溃。

任何建议或提示表示赞赏。感谢。

2 个答案:

答案 0 :(得分:0)

您无法逐行读取json,但不能读取任何内置库。我在这里为另一个答案写了一个简单的Json解析器

Convert structure to PHP array

我不得不稍作修改来处理“真正的”json“在交换机中更改此令牌

 case 'T_ENCAP_STRING':
      if( $mode == 'key'){
           $key .= trim($content,'"');
      }else{
           value .= unicode_decode($content); //encapsulated strings are always content
      }
      next($lexer_stream);//consume a token
 break;

你可以在这里测试一下

http://sandbox.onlinephpfunctions.com/code/b2917e4bb8ef847df97edbf0bb8f415a10d13c9f

并在此处找到完整(更新)的代码

https://github.com/ArtisticPhoenix/MISC/blob/master/JasonDecoder.php

不能保证它会起作用,但值得一试。修改它以读取文件应该相当容易。

答案 1 :(得分:0)

如果问题只是将大型JSON文件转换为CSV文件,则可能允许使用jq解决方案。根据计算环境的不同,jq通常可以轻松处理大型文件(GB),只需稍加努力,它通常可以处理更大的文件,因为它具有“流式解析器”。

在任何情况下,这里都是解决问题的jq解决方案:

jq -r '(.values[] | [.[0,2,3,4,5]]) | @csv' data.json > extract.csv

对于样本输入,这会产生:

"new_id","total_job_cost","total_job_revenue","total_job_profit","total_job_margin"
"34244","211.25","297.00","85.75","28.87%"
"34244","211.25","297.00","85.75","28.87%"

这是有效的CSV,@csv的使用保证结果(如果有的话)是有效的CSV,但是如果你想删除引号,有几个选项,不管它们是否“安全”是否取决于数据。这是另一种生成逗号分隔值的jq解决方案。它使用join(",")代替@csv

 (.values[] | [.[0,2,3,4,5]]) | join(",")