2017-11-20 11 views
1

まずは、大規模なJSONファイルの処理に関する多くの回答があります。しかし、私はまだ私のシナリオに遭遇するものを見つける必要があります。大きなJSONファイルの値をCSVに変換する

私が直面している問題は、私は次のようになり、大きなJSONファイル(12メガバイト)を持っていることです。

{ 
    "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% 
... 

、私はそれを読み取ろうとする際に、JSONの構文解析のためのPHPライブラリを使用して自分のサーバーがクラッシュし、それを抽出しようとすると、値の配列は、非常に大きいからです。

アドバイスやヒントありがとうございます。ありがとう。

+0

コードを入力しなくても、あなたがしたいキーアイテムを、あなたのメモリ制限を増やすことができます 'json_decode'と' implode'と 'foreach' – Forbs

+1

のですか?私が間違っていない限り、JSONに関することは、あなたがすべてそれを解析する必要があるということです。他の形式のように行単位で読むことはできません。 –

+0

また、今すぐ持っているコードを投稿してください。あなたのコードに他の問題がない限り、12MBのJSONファイルは通常はあまり問題にならないはずです。 – Sammitch

答えて

0

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; 

このトークンスイッチの変更では、「本当の」JSON」を処理するための若干の修正をしなければならなかった、ここで別の答え

Convert structure to PHP array

のための単純なJSONパーサーを書きましたここ

http://sandbox.onlinephpfunctions.com/code/b2917e4bb8ef847df97edbf0bb8f415a10d13c9f

、ここ

をフル(更新)コードを見つけます

https://github.com/ArtisticPhoenix/MISC/blob/master/JasonDecoder.php

は、それが動作を保証することはできませんが、それは試してみる価値です。あなたのファイルを読むためにそれを変更するのはかなり簡単です。

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ソリューションがあります。これは、代わりに@csvjoin(",")を使用しています。

(.values[] | [.[0,2,3,4,5]]) | join(",") 
関連する問題