2013-12-18 12 views
13

jsonファイルをPHPスクリプトを使用してCSV形式に変換しようとしています。コードは次のとおりです。PHPを使用してJSONをCSV形式に変換する

if (empty($argv[1])) die("The json file name or URL is missed\n"); 
$jsonFilename = $argv[1]; 

$json = file_get_contents($jsonFilename); 
$array = json_decode($json, true); 
$f = fopen('output.csv', 'w'); 

$firstLineKeys = false; 
foreach ($array as $line) 
{ 
    if (empty($firstLineKeys)) 
    { 
      $firstLineKeys = array_keys($line); 
      fputcsv($f, $firstLineKeys); 
      $firstLineKeys = array_flip($firstLineKeys); 
    } 

fputcsv($f, array_merge($firstLineKeys, $line)); 

}

作品のこの種のが、唯一のJSONファイルの外側の変数を返して、そして「配列の文字列への変換」警告

取得していますJSONデータは次のようになります。

{"type":"NON_ATTRIBUTED","conversion":{,"value_1":"000000100355321","value_3":"XXXX","value_4":"12667","value_5":"6"},"stream_type":"COOKIE"} 
{"type":"ATTRIBUTED","conversion":{,"value_1":"000000167865321","value_3":"YYYY","value_4":"12668","value_5":"0"},"stream_type":"COOKIE"} 
{"type":"NON_ATTRIBUTED","conversion":{,"value_1":"000000134535321","value_3":"AAAA","value_4":"12669","value_5":"9"},"stream_type":"COOKIE"} 
{"type":"NON_ATTRIBUTED","conversion":{,"value_1":"000000100357651","value_3":"WWWW","value_4":"12670","value_5":"2"},"stream_type":"COOKIE"} 

私は取得しています出力は次のようになります。 タイプ、変換、のstream_type NON_ATTRIBUT ED、アレイ、COOKIE NON_ATTRIBUTED、アレイ、COOKIE

私は期待していた出力がある: タイプ、変換、_1、VALUE_3、value_4、value_5、のstream_type NON_ATTRIBUTED、000000100355321、XXXX、1267、6、COOKIE 。 。

このよう感謝すべてのヘルプは

答えて

9

json_decode($のJSON、真の)私にとって非常に新しいです。 JSONオブジェクトを連想配列に変換します。あなたはネストされた配列がある見たよう

array(3) { 
    ["type"]=> string(14) "NON_ATTRIBUTED" 
    ["conversion"]=> array(4) { 
     ["value_1"]=> string(15) "000000100355321" 
     ["value_3"]=> string(4) "XXXX" 
     ["value_4"]=> string(5) "12667" 
     ["value_5"]=> string(1) "6" 
    } 
    ["stream_type"]=> string(6) "COOKIE" 
} 

:だからこの

{ 
    "type":"NON_ATTRIBUTED", 
    "conversion":{, 
     "value_1":"000000100355321", 
     "value_3":"XXXX", 
     "value_4":"12667", 
     "value_5":"6" 
    }, 
    "stream_type":"COOKIE" 
} 

このなり。そして、あなたは、この行で(CSVは、単純なテキストファイルです)、あなたのテキストファイルに配列のすべての要素を挿入しようとしている:

fputcsv($f, array_merge($firstLineKeys, $line)); 

配列の要素が文字列であるとき、それは素敵な作品。しかし、要素が配列されている場合は、配列を文字列に変換します。したがって、これを防ぐには、ネストした配列に対してloopまたはarray_mergeを使用する必要があります。

あなたのcsvがどのように見えるか分かりませんが、あなたのコードの修正が役立つことを願っています。そうでない場合は、下にコメントを書いてください。

if (empty($argv[1])) die("The json file name or URL is missed\n"); 
$jsonFilename = $argv[1]; 

$json = file_get_contents($jsonFilename); 
$array = json_decode($json, true); 
$f = fopen('output.csv', 'w'); 

$firstLineKeys = false; 
foreach ($array as $line) 
{ 
    if (empty($firstLineKeys)) 
    { 
     $firstLineKeys = array_keys($line); 
     fputcsv($f, $firstLineKeys); 
     $firstLineKeys = array_flip($firstLineKeys); 
    } 
    $line_array = array($line['type']); 
    foreach ($line['conversion'] as $value) 
    { 
     array_push($line_array,$value); 
    } 
    array_push($line_array,$line['stream_type']); 
    fputcsv($f, $line_array); 

} 

あなたのJSONでのミスもあります - 不要なカンマ:"conversion":{,

+0

これは完璧です!ありがとうございます:) – user2647092

+0

@Applejack 'if(empty($ firstLineKeys))'の場合、 '$ firstLineKeys'は真でなければならず、' if'ループ内の文が実行されるために空でなければなりませんか? – pHorseSpec

+0

@pHorseSpecこの行は問題自体に関連していないので、変更しませんでした。いくつかのJSONをCSVに変換する必要がある場合は、まずJSONとCSVが異なるデータ構造であるため、CSVファイルの構造を決定する必要があります。JSONはツリーで、CSVはテーブルです。トピックは独自の構造を構築し始めましたが、彼はコードとJSONファイルで間違いを犯しました。 –

関連する問題