Php 使用大型数据集将解析JSON输出转换为CSV
Parse允许用户使用导出工具下载数据,但只允许以JSON格式导出数据。我想在这个CSV格式的Excel分析 虽然一个简单的脚本就足以处理较小的JSON对象,但我处理的数据集是670000行,超过360MB。在线转换器无法处理此文件大小,经常引用PHP已超过其内存限制 我尝试过基于PHP CLI的脚本和在线转换器,但它们似乎都超出了分配的内存。我想当Php 使用大型数据集将解析JSON输出转换为CSV,php,json,csv,parse-platform,Php,Json,Csv,Parse Platform,Parse允许用户使用导出工具下载数据,但只允许以JSON格式导出数据。我想在这个CSV格式的Excel分析 虽然一个简单的脚本就足以处理较小的JSON对象,但我处理的数据集是670000行,超过360MB。在线转换器无法处理此文件大小,经常引用PHP已超过其内存限制 我尝试过基于PHP CLI的脚本和在线转换器,但它们似乎都超出了分配的内存。我想当ini_集('memory_limit','4096M')时,我需要一种新的方法仍然没有给我足够的内存 我当前正在使用此基于CLI的脚本解析数据:
ini_集('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\u decode
更好的读入JSON对象的方法?如果您能够在浏览器中运行脚本,请查看JavaScript库——它支持对大型数据集进行分块和多线程处理,并且可以进行转换
可能相关的具体信息:
worker
chunk
fastMode
或者,有一个for Node.js,但没有worker
和chunk
选项
我与这个库没有任何关系,但已成功地将其用于大型数据集上的CSV到JSON转换。事实证明,PHP本身并不支持流式JSON解析器(基于我在做一些研究时发现的情况)。然而,他写了一篇关于他们如何创建一个
使用他们的example.php
文件,我能够成功地将JSON文件读入php对象
我还需要做一些其他的事情来实现这一点:
- 增加PHP的内存限制:我将PHP.ini中的
内存限制更改为内存限制=2048M
- 修改
flatt2CSV()
函数:我的新代码需要包含其JSON的解析格式,即{“结果”:[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可能无法在这种情况下工作。我的解析对象不太复杂,因此指针数组可能会破坏这一点。您可以尝试使用:
要转换:
{"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]"}
致:
你也可以
json2csv -k user.name,remote_ip -i input.json -o output.csv
是否需要一批处理所有文件?如果可以批量导出JSON,然后进行单独的转换,那么您可能不需要那么多的活动内存。您有正在使用的代码吗?-这个用例也需要PHP吗?可以在较小的数据集中从解析中导出数据,但这对于定期从数据库中提取数据来说非常耗时。我在JSON2CSV类中添加了JSON,我用它来解析JSON。我不熟悉解析。你能写一个脚本把较小的文件集拉下来吗?此外,如果您在网页中运行此操作以进行转换,那么如果您不需要屏幕上的输入,那么它就没有意义。在命令行、计划等中作为批处理作业来执行此操作更有意义。您能否澄清为什么要在浏览器中执行此操作。用于移动应用程序开发的流行后端数据库和API组合也是如此。我并不是专门在浏览器中做这件事——我对任何将JSON转换成CSV的方法都持开放态度。编写脚本会导致I/O,这是有问题的,因为解析会限制API调用。
json2csv -k user.name,remote_ip -i input.json -o output.csv