嗨,我正在尝试将数组格式与普通格式不同的json文件转换为csv文件。我一直在试图找到一种解决方案,将其转换为一个csv文件,但我找不到解决方案。
<?php
$jsondata = '[{
"accession_number_original": "2012.11.45",
"author_birth_date": [
"1932"
],
"author_date": [
"1932"
],
"author_death_date": [
""
],
"author_description": [
"American"
],
"author_display": [
"Day yon"
],
"author_names_first": [
"Day"
],
"author_names_last": [
"yon"
],
"author_names_middle": [
""
],
"image_height": "12 1/2",
"image_width": "18 1/4",
"jp2_image_url": "",
"location_physical_location": "Art Gallery",
"location_shelf_locator": "Unknown",
"master_image_url": "",
"note_provenance": "Gift of Gary Ginsberg and Susanna Aaron",
"object_date": "1963/2010",
"object_depth": "",
"object_height": "",
"object_width": "",
"origin_datecreated_end": "1963",
"origin_datecreated_start": "1963",
"physical_description_extent": [
"12 1/2 x 18 1/4"
],
"physical_description_material": [
"Gelatin silver print"
],
"physical_description_technique": [
"Gelatin silver print"
],
"pid": "bdr:123456",
"title": "As Demonstrators"
}]';
$jsonDecoded = json_decode($jsondata);
print_r('<pre>');
print_r($jsonDecoded);
print_r('</pre>');
$fh = fopen('fileout.csv', 'w');
if (is_array($jsonDecoded)){
print_r('<-------- line variable output-------->');
foreach($jsonDecoded as $line){
print_r('<pre>'); print_r($line); print_r('</pre>');
print_r('<-------- data variable output-------->');
if (is_array($line)||is_object($line)){
foreach($line as $data){
fputcsv($fp,$data);
}
}
}
}
}
fclose($fh);
print_r('Converted Successfully');
?>
我尝试研究了stackoverflow中的大多数类似问题,但是没有一个类似的问题,因此对我没有太大帮助。
如果我使用单个foreach ,则会收到错误消息,表示“数组到字符串的转换失败”,并且将数组作为值而不是实际数据打印到csv文件中。
如果我使用两个foreach我得到错误fputcsv()期望参数2是给定的数组字符串
解码后的json的var_dump或print_r结果如下
Array
(
[0] => stdClass Object
(
[accession_number_original] => 2012.11.45
[author_birth_date] => Array
(
[0] => 1932
)
[author_date] => Array
(
[0] => 1932
)
[author_death_date] => Array
(
[0] =>
)
[author_description] => Array
(
[0] => American
)
[author_display] => Array
(
[0] => Day yon
)
[author_names_first] => Array
(
[0] => Day
)
[author_names_last] => Array
(
[0] => yon
)
[author_names_middle] => Array
(
[0] =>
)
[image_height] => 12 1/2
[image_width] => 18 1/4
[jp2_image_url] =>
[location_physical_location] => Art Gallery
[location_shelf_locator] => Unknown
[master_image_url] =>
[note_provenance] => Gift of Gary Ginsberg and Susanna Aaron
[object_date] => 1963/2010
[object_depth] =>
[object_height] =>
[object_width] =>
[origin_datecreated_end] => 1963
[origin_datecreated_start] => 1963
[physical_description_extent] => Array
(
[0] => 12 1/2 x 18 1/4
)
[physical_description_material] => Array
(
[0] => Gelatin silver print
)
[physical_description_technique] => Array
(
[0] => Gelatin silver print
)
[pid] => bdr:123456
[title] => As Demonstrators
)
)
正如我在评论中提到的那样,第一步将是处理数组值,因此每一行都需要转换值(它仅以您提供的格式计数,如果存在带有2个值的数组,则只会传递第一个值)到csv)。
您修改的源代码:
$jsonDecoded = json_decode($jsondata, true); // add true, will handle as associative array
print_r('<pre>');
print_r($jsonDecoded);
print_r('</pre>');
$fh = fopen('fileout.csv', 'w');
if (is_array($jsonDecoded)) {
print_r('<-------- line variable output-------->');
foreach ($jsonDecoded as $line) {
// with this foreach, if value is array, replace it with first array value
foreach ($line as $key => $value) {
if (is_array($value)) {
$line[$key] = $value[0];
}
}
print_r('<pre>'); print_r($line); print_r('</pre>');
// no need for foreach, as fputcsv expects array, which we already have
if (is_array($line)) {
fputcsv($fh,$line);
}
}
}
fclose($fh);
print_r('Converted Successfully');
执行后的脚本输出:
[output of your print_r($jsonDecoded);]
<-------- line variable output-------->
Array
(
[accession_number_original] => 2012.11.45
[author_birth_date] => 1932
[author_date] => 1932
[author_death_date] =>
[author_description] => American
[author_display] => Day yon
[author_names_first] => Day
[author_names_last] => yon
[author_names_middle] =>
[image_height] => 12 1/2
[image_width] => 18 1/4
[jp2_image_url] =>
[location_physical_location] => Art Gallery
[location_shelf_locator] => Unknown
[master_image_url] =>
[note_provenance] => Gift of Gary Ginsberg and Susanna Aaron
[object_date] => 1963/2010
[object_depth] =>
[object_height] =>
[object_width] =>
[origin_datecreated_end] => 1963
[origin_datecreated_start] => 1963
[physical_description_extent] => 12 1/2 x 18 1/4
[physical_description_material] => Gelatin silver print
[physical_description_technique] => Gelatin silver print
[pid] => bdr:123456
[title] => As Demonstrators
)
Converted Successfully
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句