使用jq将JSON转换为CSV

问题描述:

我试图使用jq提取我的JSON文件中的sids, ll, state, name, smry值并导出到csv。使用jq将JSON转换为CSV

JSON文件(out.json):

{ 
    "data": [ 
     { 
      "meta": { 
       "uid": 74529, 
       "ll": [ 
        -66.9333, 
        47.0667 
       ], 
       "sids": [ 
        "CA008102500 6" 
       ], 
       "state": "NB", 
       "elev": 1250, 
       "name": "LONG LAKE" 
      }, 
      "smry": [ 
       [ 
        "42", 
        "1955-02-23" 
       ] 
      ] 
     }, 
     { 
      "meta": { 
       "uid": 74534, 
       "ll": [ 
        -67.2333, 
        45.9667 
       ], 
       "sids": [ 
        "CA008103425 6" 
       ], 
       "state": "NB", 
       "elev": 150.9, 
       "name": "NACKAWIC" 
      }, 
      "smry": [ 
       [ 
        "40", 
        "1969-02-23" 
       ] 
      ] 
     }, 
     { 
      "meta": { 
       "uid": 74549, 
       "ll": [ 
        -67.4667, 
        47.4667 
       ], 
       "sids": [ 
        "CA008104933 6" 
       ], 
       "state": "NB", 
       "elev": 794, 
       "name": "ST QUENTIN" 
      }, 
      "smry": [ 
       [ 
        "M", 
        "M" 
       ] 
      ] 
     }, 
     { 
      "meta": { 
       "uid": 74550, 
       "ll": [ 
        -67.2667, 
        45.1833 
       ], 
       "sids": [ 
        "CA008104936 6" 
       ], 
       "state": "NB", 
       "elev": 36.1, 
       "name": "ST STEPHEN" 
      }, 
      "smry": [ 
       [ 
        "48", 
        "1900-02-23" 
       ] 
      ] 
     }, 
     { 
      "meta": { 
       "uid": 74554, 
       "ll": [ 
        -67.25, 
        47.2667 
       ], 
       "sids": [ 
        "CA008105000 6" 
       ], 
       "state": "NB", 
       "elev": 915.4, 
       "name": "SISSON DAM" 
      }, 
      "smry": [ 
       [ 
        "35", 
        "1955-02-23" 
       ] 
      ] 
     } 
    ] 
} 

终端代码:

jq '.data | [ {sids, ll, state, name, smry} ]' out.json 

我收到以下错误:

assertion "cb == jq_util_input_next_input_cb" failed: file "/usr/src/ports/jq/jq-1.5-3.x86_64/src/jq-1.5/util.c", line 371, function: jq_util_input_get_position 
Aborted (core dumped) 

为例e预期输出:

sids, ll, state, name, smry 
CA008102500, -66.9333, 47.0667, NB, LONG LAKE, 42,1955-02-23 
CA008103425, -67.2333, 45.9667, NB, NACKAWIC, 35,1955-02-23 

我在做什么错?

+0

有很多结构在JSON中,你忽略了你的尝试。不过,您可能会使用旧版本的'jq';我得到一个简单的错误'jq:error(at tmp.json:6):不能用字符串“sids”而不是一个核心转储索引数组。 – chepner

+0

嗨@chepner!我对'json'不是很熟悉,但是我已经认识到了文件的复杂树结构。 – arnpry

+0

@arnpry:让你开始的东西,'jq --raw-output'.data [] | .meta | “\(.sids)\(.ll)\(。state)\(。name)”“'给出了值,但我没有足够的知识来压扁数组。 – Inian

这有点复杂,因为在平坦化整个记录之前,您需要扁平化sidsllsmry。我建议创建一个jq文件:

foo.jq

.data[]|{ 
    "sids":(.meta.sids[0]|split(" ")[0]), 
    "ll":(.meta.ll|map(tostring)|join(",")), 
    "state":.meta.state, 
    "name":.meta.name, 
    "smry":(.smry[]|join(",")) 
}|join(",") 

然后调用:

jq -rf foo.jq file.json 

输出:

CA008102500,-66.9333,47.0667,NB,LONG LAKE,42,1955-02-23 
CA008103425,-67.2333,45.9667,NB,NACKAWIC,40,1969-02-23 
CA008104933,-67.4667,47.4667,NB,ST QUENTIN,M,M 
CA008104936,-67.2667,45.1833,NB,ST STEPHEN,48,1900-02-23 
CA008105000,-67.25,47.2667,NB,SISSON DAM,35,1955-02-23 
+0

这看起来像我想要做的!尽管获得以下错误:“jq:错误:语法错误,意外的INVALID_CHARACTER(Unix shell引用问题?)在,第1行: jq:1编译错误” – arnpry

+0

真的不能相信。你确定你正确地复制了命令? – hek2mgl

+1

哎呀!我使用Notepad ++创建了该文件,当我保存该文件时,EOL Conversion被设置为Windows(这增加了额外的换行符),而不是Unix。 – arnpry