2013-12-18 83 views
13

我想用php腳本將json文件轉換爲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"} 

我得到的輸出是: 型,轉換,流_ 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對象轉換爲關聯數組。因此,這

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

成爲這樣的:

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" 
} 

正如你看到有嵌套數組。而你試圖陣列中的所有元素插入到你的文本文件(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'是否必須爲true,因此'if'循環中的語句才能運行? – pHorseSpec

+0

@pHorseSpec這條線與問題本身無關,所以我沒有改變它。如果您需要將某些JSON轉換爲CSV,則首先應決定CSV文件的結構,因爲JSON和CSV是不同的數據結構:JSON是樹,CSV是表格。主題開始構建自己的結構,但他在代碼和JSON文件中出現錯誤,所以我所做的只是修復了它。 –