Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用大型数据集将解析JSON输出转换为CSV_Php_Json_Csv_Parse Platform - Fatal编程技术网

Php 使用大型数据集将解析JSON输出转换为CSV

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的脚本解析数据:

Parse允许用户使用导出工具下载数据,但只允许以JSON格式导出数据。我想在这个CSV格式的Excel分析

虽然一个简单的脚本就足以处理较小的JSON对象,但我处理的数据集是670000行,超过360MB。在线转换器无法处理此文件大小,经常引用PHP已超过其内存限制

我尝试过基于PHP 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