【问题标题】:How to format a csv file using json data?如何使用 json 数据格式化 csv 文件?
【发布时间】:2018-01-02 14:56:52
【问题描述】:

我有一个需要转换为 csv 文件的 json 文件,但我对信任 json-to-csv 转换器站点有点谨慎,因为输出的数据似乎不正确......所以我希望在这里寻求帮助!

我有以下json文件结构:

{
    "GroupName": "GrpName13",
    "Number": 3,
    "Notes": "Test Group ",
    "Units": [
    {
        "UnitNumber": "TestUnit13",
        "DataSource": "Factory",
        "ContractNumber": "TestContract13",
        "CarNumber": "2",
        "ControllerTypeMessageId" : 4,
        "NumberOfLandings": 4,
        "CreatedBy": "user1",
        "CommissionModeMessageId": 2,
        "Details": [
        {
            "DetailName": "TestFloor13",
            "DetailNumber": "5"
        }
        ],
        "UnitDevices": [
        {
            "DeviceTypeMessageId": 1,
            "CreatedBy": "user1"
        }                               
        ]
    }
    ]
}

我认为我看到的问题是转换器似乎无法理解许多嵌套数据值。我认为转换器错误的原因是因为当我尝试使用它们转换回 json 时,我没有收到相同的结构。

有谁知道如何手动将此 json 格式化为 csv 格式,或者知道如何处理嵌套值的可靠转换器?

【问题讨论】:

  • 那么 CSV 格式意味着您正在处理一个 常规 表。无法在 CSV 文件中正确表示树状结构。但是,如果您要“转换”的结构始终具有相同的结构和相同数量的子项,则您可以将树结构转换为您以相同方式用于所有元素的列。即:在生成 CVS 文件之前,您必须先“扁平化”您的结构。

标签: json excel csv converter


【解决方案1】:

试试

www.json-buddy.com/convert-json-csv-xml.htm

如果不适合你,那么你可以试试这个工具

http://download.cnet.com/JSON-to-CSV/3000-2383_4-76680683.html

应该会有所帮助!

【讨论】:

    【解决方案2】:

    我已经在这个 url 上尝试了你的 json:

    http://www.convertcsv.com/json-to-csv.htm

    结果: UnitNumber,DataSource,ContractNumber,CarNumber,ControllerTypeMessageId,NumberOfLandings,CreatedBy,CommissionModeMessageId,Details/0/DetailName,Details/0/DetailNumber,UnitDevices/0/DeviceTypeMessageId,UnitDevices/0/CreatedBy TestUnit13,Factory,TestContract13,2,4,4,user1,2,TestFloor13,5,1,user1

    因为它可以保存键的路径,比如'UnitDevices'列表中的'DeviceTypeMessageId':它会将列名命名为'UnitDevices/0/DeviceTypeMessageId',这样可以避免同名错误,所以你可以通过转换器规则获取列名。

    希望有帮助。

    【讨论】:

      【解决方案3】:

      这是使用jq的解决方案

      如果文件filter.jq包含

      def denormalize:
        def headers($p):
            keys_unsorted[] as $k
          | if   .[$k]|type == "array" then (.[$k]|first|headers("\($p)\($k)_"))
            else "\($p)\($k)"
            end
        ;
        def setup:
          [
            keys_unsorted[] as $k
          | if   .[$k]|type == "array" then [ .[$k][]| setup ]
            else .[$k]
            end
          ]
        ;
        def iter:
          if length == 0 then []
          elif .[0]|type != "array" then
            [.[0]] + (.[1:] | iter)
          else
              (.[0][] | iter) as $x
            | (.[1:]  | iter) as $y
            | [$x[]] + $y
          end
        ;
        [ headers("") ], (setup | iter)
      ;
      
      denormalize | @csv
      

      data.json 包含(注意添加了额外的示例)

      {
        "GroupName": "GrpName13",
        "Notes": "Test Group ",
        "Number": 3,
        "Units": [
          {
            "CarNumber": "2",
            "CommissionModeMessageId": 2,
            "ContractNumber": "TestContract13",
            "ControllerTypeMessageId": 4,
            "CreatedBy": "user1",
            "DataSource": "Factory",
            "Details": [
              {
                "DetailName": "TestFloor13",
                "DetailNumber": "5"
              }
            ],
            "NumberOfLandings": 4,
            "UnitDevices": [
              {
                "CreatedBy": "user1",
                "DeviceTypeMessageId": 1
              },
              {
                "CreatedBy": "user10",
                "DeviceTypeMessageId": 10
              }
            ],
            "UnitNumber": "TestUnit13"
          },
          {
            "CarNumber": "99",
            "CommissionModeMessageId": 99,
            "ContractNumber": "Contract99",
            "ControllerTypeMessageId": 99,
            "CreatedBy": "user99",
            "DataSource": "Another Factory",
            "Details": [
              {
                "DetailName": "TestFloor99",
                "DetailNumber": "99"
              }
            ],
            "NumberOfLandings": 99,
            "UnitDevices": [
              {
                "CreatedBy": "user99",
                "DeviceTypeMessageId": 99
              }
            ],
            "UnitNumber": "Unit99"
          }
        ]
      }
      

      然后是命令

      jq -M -r -f filter.jq data.json    
      

      会产生

      "GroupName","Notes","Number","Units_CarNumber","Units_CommissionModeMessageId","Units_ContractNumber","Units_ControllerTypeMessageId","Units_CreatedBy","Units_DataSource","Units_Details_DetailName","Units_Details_DetailNumber","Units_NumberOfLandings","Units_UnitDevices_CreatedBy","Units_UnitDevices_DeviceTypeMessageId","Units_UnitNumber"
      "GrpName13","Test Group ",3,"2",2,"TestContract13",4,"user1","Factory","TestFloor13","5",4,"user1",1,"TestUnit13"
      "GrpName13","Test Group ",3,"2",2,"TestContract13",4,"user1","Factory","TestFloor13","5",4,"user10",10,"TestUnit13"
      "GrpName13","Test Group ",3,"99",99,"Contract99",99,"user99","Another Factory","TestFloor99","99",99,"user99",99,"Unit99"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-04
        • 2018-09-03
        • 1970-01-01
        • 2016-11-12
        • 1970-01-01
        • 2020-11-11
        • 1970-01-01
        相关资源
        最近更新 更多