バージョン
PHP 5.2.1 (cli) (built: May 28 2007 19:31:00)
コード
json2csv.php
<?php
ini_set("memory_limit", "512M");
$str = file_get_contents("json.txt");
$json = json_decode($str, true);
$fp = STDOUT;
$columns = array();
foreach ($json as $fields) {
if (empty($columns)){
$columns = array_keys($fields);
fputcsv($fp, $columns);
}
$contents = array();
foreach($columns as $column) {
$contents[] = isset($fields[$column]) ? $fields[$column] : "";
}
fputcsv($fp, $contents);
}
解説
json.txtに保存されたオブジェクト配列のjson形式文字列をすべてメモリに読み込んでcsvとして標準出力に出力します。
sample.json
[
{"key1":"value1","key2":"value2"},
{"key1":"value1","key2":"value2"}
]
ini_set("memory_limit", "512M");
memory_limitは扱いたいjsonの量によって変わるので適宜変更します。
障害対応で書いたソースコードのため、メモリのことは特に考えていません。
なので、あまりにも巨大なjsonは扱うことができません。
$fp = STDOUT;
調べたら上記のコードが出てきたので、初めてSTDOUTを指定しましたが、楽で良いですね。
軽いものならそのまま出しても良いし、実行時に出力先を変えられるし楽です。
php json2csv.php > result.csv
if (empty($columns)){
$columns = array_keys($fields);
fputcsv($fp, $columns);
}
上記のコードでは、1番目のobjectからヘッダー行を取得しています。
そこからマッピングして組み立てています。