2013-12-18 7 views
13

Я пытаюсь преобразовать json-файл в формат csv с использованием php-скрипта. Код выглядит следующим образом:Преобразование формата JSON в CSV с использованием PHP

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 в ассоциативные массивы. Так что это

{ 
    "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)); 

Это работает хорошо, когда элемент массива является строкой. Но когда элемент является массивом, мы получили преобразование Array в строку. Поэтому вы должны использовать 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, вы должны решить структуру своего CSV-файла, прежде всего потому, что JSON и CSV - это разные структуры данных: JSON - это дерево, а CSV - таблица. Тема начала строить свою собственную структуру, но он ошибся в своем коде и в файле JSON, поэтому все, что я сделал, просто исправлено. –

Смежные вопросы