2013-11-24 63 views
18

我想轉換的對象,看起來像這樣:如何將對象映射到數組,以便它可以轉換爲csv?

{ 
    "123" : "abc", 
    "231" : "dbh", 
    "452" : "xyz" 
} 

到CSV,看起來像這樣:

"123","abc" 
"231","dbh" 
"452","xyz" 

我更願意使用命令行工具jq但不能似乎弄清楚如何完成這項任務。我設法使用jq '. | keys' test.json獲得密鑰,但無法弄清下一步該做什麼。

問題是你不能像這樣直接將k:v對象轉換成csv與@csv。它需要是一個數組,所以我們需要首先轉換爲數組。如果鍵被命名,它會很簡單,但它們是動態的,所以它不那麼容易。

+0

爲什麼不GSUB ':' 對 ''? –

+0

google'JSON to csv' ...很多結果 – charlietfl

+0

在15秒內在搜索框的頂部找到了這個頁面..http://stackoverflow.com/questions/8847766/how-to-convert-json-to- csv-format-and-store-in-a-variable/8924856#8924856 – charlietfl

回答

25

嘗試這個濾波器:

to_entries[] | [.key, .value] 
  • to_entries將對象轉換爲鍵/值對象的數組。 []將數組分解爲數組中的每個項目
  • 然後對於每個項目,轉換爲包含鍵和值的數組。

這將產生以下的輸出:

[ 
    "123", 
    "abc" 
], 
[ 
    "231", 
    "dbh" 
], 
[ 
    "452", 
    "xyz" 
] 

然後你可以使用@csv過濾器的行轉換爲CSV行。

$ echo '{"123":"abc","231":"dbh","452":"xyz"}' | jq -r 'to_entries[] | [.key, .value] | @csv' 
"123","abc" 
"231","dbh" 
"452","xyz" 
+0

嗯。對我來說,這返回「'\」123 \「,\」abc \「」'等。每行另外引用。 –

+3

確保你在調用中加入了'-r'標誌。你會想要獲得原始輸出。 –

+0

謝謝,我忽略了這一點。 –

1

傑夫答案是一個很好的起點,更接近於你所期望的:

cat input.json | jq 'to_entries | map([.key, .value]|join(","))' 

[ 
"123,abc", 
"231,dbh", 
"452,xyz" 
] 

,但沒有找到一種方法使用新行加入:

cat input.json | jq 'to_entries | map([.key, .value]|join(","))|join("\n")' 

"123,abc\n231,dbh\n452,xyz" 
+0

「\ n」是換行符的JSON表示;要將它看作是一個字面換行符,請使用jq的-r命令行選項。但是,一般來說,使用'@ csv'來獲取CSV是最好的方式,因爲@csv確實能夠生成有效的CSV。 – peak

3

下面是一個例子我結束了今天上午的使用(處理PagerDuty提醒):

cat /tmp/summary.json | jq -r ' 
    .incidents 
    | map({desc: .trigger_summary_data.description, id:.id}) 
    | group_by(.desc) 
    | map(length as $len 
    | {desc:.[0].desc, length: $len}) 
    | sort_by(.length) 
    | map([.desc, .length] | @csv) 
    | join("\n") ' 

這轉儲CVS分隔的文件看起來像: "[Triggered] Something annoyingly frequent",31 "[Triggered] Even more frequent alert!",35 "[No data] Stats Server is probably acting up",55

-3
onecol2txt() { 
awk 'BEGIN { RS="_end_"; FS="\n"} 
    { for (i=2; i <= NF; i++){ 
     printf "%s ",$i 
     } 
    printf "\n" 
    }' 
} 
cat jsonfile | jq -r -c '....,"_end_"' | onecol2txt 
相關問題