将Parse JSON输出转换为具有大型数据集的CSV

时间:2015-04-17 21:21:37

标签: php json csv parse-platform

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

3 个答案:

答案 0 :(得分:1)

如果您能够在浏览器中运行脚本,请查看PapaParse JavaScript库 - 它支持更大数据集的分块和多线程,并且可以转换JSON to CSV

可能相关的具体config options

  • worker
  • chunk
  • fastMode

或者,Node.js有fork of PapaParse,但没有workerchunk选项。

我与此库没有任何关系,但已成功用于大型数据集上的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对象。

我必须做的其他一些事项才能完成这项工作:

  • 增加PHP的内存限制:我将php.ini中的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数组可能会破坏它。