How to format a csv file using json data?

若如初见. 提交于 2019-12-11 07:34:56

问题


I have a json file that I need to convert to a csv file, but I am a little wary of trusting a json-to-csv converter site as the outputted data seems to be incorrect... so I was hoping to get some help here!

I have the following json file structure:

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

The issue I think Im seeing is that the converters seem to not be able to comprehend the many nested data values. And the reason I think the converters are wrong is because when I try to convert back to json using them, I dont receive the same structure.

Does anyone know how to manually format this json into csv format, or know of a reliable converter than can handle nested values?


回答1:


Try

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

if not working for you then you can try this tool

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

should be helpful!




回答2:


I have tried your json on this for url:

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

As a result: 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

Because it could save the path of the key,like the 'DeviceTypeMessageId' in list 'UnitDevices': it will named the columns name with 'UnitDevices/0/DeviceTypeMessageId', this could avoid the same name mistake, so you can get the columns name by its converter rules.

Hope helpful.




回答3:


Here is a solution using jq

If the file filter.jq contains

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

and data.json contains (note extra samples added)

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

then the command

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

will produce

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


来源:https://stackoverflow.com/questions/45341295/how-to-format-a-csv-file-using-json-data

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!