Parse允许用户使用导出工具下载数据,但只允许以JSON格式导出数据。我想用CSV格式在Excel中进行分析。
虽然一个简单的脚本足以容纳较小的JSON对象,但我正在处理一个670,000行和超过360MB的数据集。在线转换器无法处理此文件大小,经常引用PHP已超出其内存限制。
我已经尝试过基于PHP CLI的脚本和在线转换器,但它们似乎都超出了他们分配的内存。我认为当ini_set('memory_limit', '4096M');
仍然没有给我足够的记忆时我需要一种新的方法。
我目前正在使用这个基于CLI的脚本来解析数据:
// flatten to CSV
function flatten2CSV($file){
$fileIO = fopen($file, 'w+');
foreach ($this->dataArray as $items) {
$flatData = array();
$fields = new RecursiveIteratorIterator(new RecursiveArrayIterator($items));
foreach($fields as $value) {
array_push($flatData, $value);
}
fputcsv($fileIO, $flatData, ";", '"');
}
fclose($fileIO);
}
// and $this->dataArray is created here
function readJSON($JSONdata){
$this->dataArray = json_decode($JSONdata,1);
$this->prependColumnNames();
return $this->dataArray;
}
private function prependColumnNames(){
foreach(array_keys($this->dataArray[0]) as $key){
$keys[0][$key] = $key;
}
$this->dataArray = array_merge($keys, $this->dataArray);
}
如何通过PHP解析内存管理问题并解析这个大型数据集?对于大型数据集,是否有更好的方法来读取JSON对象而不是json_decode
?
答案 0 :(得分:1)
如果您能够在浏览器中运行脚本,请查看PapaParse JavaScript库 - 它支持更大数据集的分块和多线程,并且可以转换JSON to CSV。
可能相关的具体config options:
worker
chunk
fastMode
或者,Node.js有fork of PapaParse,但没有worker
和chunk
选项。
我与此库没有任何关系,但已成功用于大型数据集上的CSV到JSON转换。
答案 1 :(得分:1)
您可以尝试使用: https://github.com/jehiah/json2csv
转换:
{"user": {"name":"jehiah", "password": "root"}, "remote_ip": "127.0.0.1", "dt" : "[20/Aug/2010:01:12:44 -0400]"}
{"user": {"name":"jeroenjanssens", "password": "123"}, "remote_ip": "192.168.0.1", "dt" : "[20/Aug/2010:01:12:44 -0400]"}
{"user": {"name":"unknown", "password": ""}, "remote_ip": "76.216.210.0", "dt" : "[20/Aug/2010:01:12:45 -0400]"}
为:
"jehiah","127.0.0.1"
"jeroenjanssens","192.168.0.1"
"unknown","76.216.210.0"
你要么
json2csv -k user.name,remote_ip -i input.json -o output.csv
答案 2 :(得分:0)
事实证明,PHP本身并不支持流式JSON解析器(基于我发现的一些研究)。但是,Salsify撰写了an excellent blog post关于他们如何创建streaming JSON parser for PHP。
的文章This is the link to the GitHub code
使用他们的example.php
文件,我能够成功地将JSON文件读入PHP对象。
我必须做的其他一些事项才能完成这项工作:
memory_limit
更改为memory_limit=2048M
修改flatten2CSV()
函数:我的新代码需要包含其JSON的Parse格式{ "results": [ objects ] }
。新功能是:
function flatten2CSV($file, $data){
$fileIO = fopen($file, 'w+');
foreach ($data['results'] as $items) {
$flatData = array();
$fields = new RecursiveIteratorIterator(new RecursiveArrayIterator(new RecursiveArrayIterator($items)));
foreach($fields as $value) {
array_push($flatData, $value);
}
fputcsv($fileIO, $flatData, ";", '"');
}
fclose($fileIO);
}
手动添加标题:为了本练习的目的,上面的代码足以让我解析我的文件。但是,我必须手动将标题行添加到我的CSV文件中。我建议编写代码来提取密钥并将其添加为标题。
YMMV具有此功能。因为我必须专门为Parse JSON修改函数,所以你的JSON可能不适用于此。我的Parse对象并不太复杂,因此Pointers数组可能会破坏它。