【问题标题】:PHP script to convert Json to CSV将 Json 转换为 CSV 的 PHP 脚本
【发布时间】:2014-04-21 04:56:34
【问题描述】:

我有一个 API JSON 服务,需要创建一个脚本来将数据导出到 CSV 文件。 有没有人有 php 脚本将 JSON 迁移到 CSV 格式?

示例 Json 文件

  {"packWidth":200,
  "itemNo":"SEH404",
  "groupItemNo":"SEH404",
  "status":1,
  "categoryId":24356,
  "packType":"ColorBox",
  "barcode":"1234567890987",
  "modelLabel":"Color",
  "modelList":[{"key":"SEH404","value":"Black"},{"key":"SEH404W","value":"White"}],
  "packQty":20,
  "packInclude":"USB Adapter, USB Charger, Earphone, Leather Case",
  "id":3456}

一个重要的部分是带有标签“modelList”的数组

数组modelList的结果,每个值必须是一列

示例:

packWidth、itemNo、groupItemNo、status、categoryId、packType、barcode、modelLabel、modelList1、modelList2、packQty、packInclude、id

200, SEH404, SEH404, 1, 24356, ColorBox, 1234567890987, 颜色, SEH404:Black, SEH404W:White, 20, USB Adapter..., 3456

有些产品可能还包含5条记录“modelList1-modelList2 modelList3-modelList4-modelList5。没有modelList的产品将modelList记录为空。

【问题讨论】:

  • 使用内置的 json_decode($jsonString, true) 函数将该 JSON 字符串转换为数组,然后对其进行迭代并输出您需要的内容。
  • 你想如何输出模型列表?对我来说,这将是一个完整的字符串,来自 "[{"key":"SEH404","value":"Black"},{"key":"SEH404W","value":"White"}]"跨度>
  • 你想用modelList数组做什么?如何在 CSV 中表示该数据?
  • 数组modelList的结果,每个值必须是一列示例:-----name columns-----packWidth, itemNo, groupItemNo, status, categoryId, packType,barcode, modelLabel, modelList1, modelList2, packQty, packInclude, id -------value-------- 200, SEH404, SEH404, 1, 24356, ColorBox, 1234567890987, Color, SEH404:Black, SEH404W:White , 20, USB 适配器... , 3456
  • @user3406254:ModelList 将始终包含 2 条要与 : 在 modelList1 和 modelList2 列中连接的记录?

标签: php json csv


【解决方案1】:

请试试这个。 假设 $json 是原始数据,所以我一开始就解码了。

$json = json_decode($json);

// Will use $csv to build our CSV content
$csv = array();

// Need to define the special column
$modelList = 'modelList';

// Find necessary additional column number for modelList
$maxSubData = 0;
foreach ($json as $id => $data)
{
    $maxSubData = max(array(count($data->modelList), $maxSubData ));
}

// Headers for CSV file
// Headers Start
$headers = array();
foreach ($json[0] as $key => $value)
{
    if ($key == $modelList)
    {
        for ($i = 1; $i <= $maxSubData; $i++)
        {
            $headers[] = $modelList . $i;
        }
    }
    else
    {
        $headers[] = $key;
    }
}
$csv[] = '"' . implode('","', $headers) . '"';
// Headers End

// Now the rows
// Rows Start
foreach ($json as $data)
{
    $fieldValues = array();
    foreach ($data as $key => $value )
    {
        if ($key == $modelList)
        {
            $j = 0;
            foreach ($value as $subValue)
            {
                $subData = array();
                foreach ($subValue as $subCols)
                {
                    $subData[] = $subCols;
                }
                $j++;
                $fieldValues[] = htmlspecialchars(implode(':', $subData ));
            }
            for ($i = $j + 1; $i <= $maxSubData; $i++)
            {
                $fieldValues[] = '';
            }
        }
        else
        {
            $fieldValues[] = htmlspecialchars($value);
        }
    }

    $csv[] = '"' . implode('","', $fieldValues) . '"';
}
// Rows End

$finalCSV = implode("\n", $csv);

print $finalCSV;

【讨论】:

  • 一个产品modelList可以工作,但是如果我的json文件中有很多产品,第一个是没有记录modelList就不行了。
  • 这是原始的json文件,我试过了,但是脚本效果不好,不换行。 dropbox.com/s/37k18vq538x5gio/json.txt
  • 发布的代码是针对您的初始问题的任何可能解决方案的最简化版本,它还使用最初未提供的可能要求扩展了初始问题。它可以适应您项目中的进一步要求。因此,我希望它提供了一个良好的起点,就像在问题中提到的“与产品一起工作”一样。我希望它有所帮助。
  • 您好,感谢您的帮助。当然,这是一个很棒的脚本,我只需要适应我的需要。再次感谢
  • 对不起,我能问你最后一个问题吗?将值写入csv文件最后一列的modelList,避免数据混乱,可以吗?如果您希望我回复,请提前感谢
【解决方案2】:

这是不可能的,因为在 JSON 中你有分层数据结构,而 CSV 只是二维的(见 modelList 属性)。

【讨论】:

  • 这是原始的json文件,我试过了,但是脚本效果不好,不换行。 dropbox.com/s/37k18vq538x5gio/json.txt
  • 您可以使用迭代器创建一个普通表并为 csv 头创建嵌套键
  • “感谢”投反对票,但仍然 - 普通表就是普通表。根本无法完全覆盖json可以有的多层次的深层次结构。
猜你喜欢
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 2012-03-23
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多