2017-02-23 166 views
1

我試圖使用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

回答

5

這有點複雜,因爲在平坦化整個記錄之前,您需要扁平化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