首先,我感谢有很多关于处理大型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解析时,我的服务器在尝试读取它时会崩溃。
任何建议或提示表示赞赏。感谢。
答案 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(",")