2015-04-21 70 views
0

我在Windows 64位機器上使用JQ 1.4。如何使用JQ 1.4將複雜的JSON轉換爲CSV

下面是輸入文件的內容IP.txt

{ 
    "results": [ 
    { 
     "name": "Google", 
     "employees": [ 
     { 
      "name": "Michael", 
      "division": "Engineering" 
     }, 
     { 
      "name": "Laura", 
      "division": "HR" 
     }, 
     { 
      "name": "Elise", 
      "division": "Marketing" 
     } 
     ] 
    }, 
    { 
     "name": "Microsoft", 
     "employees": [ 
     { 
      "name": "Brett", 
      "division": "Engineering" 
     }, 
     { 
      "name": "David", 
      "division": "HR" 
     } 
     ] 
    } 
    ] 
} 

{ 
    "results": [ 
    { 
     "name": "Amazon", 
     "employees": [ 
     { 
      "name": "Watson", 
      "division": "Marketing" 
     } 
     ] 
    } 
    ] 
} 

文件包含兩個"results"。第一個結果包含2個公司的信息:GoogleMicrosoft。第二個結果包含Amazon的信息。 我想將此JSON轉換爲公司名稱和員工姓名的csv文件。

"Google","Michael" 
"Google","Laura" 
"Google","Elise" 
"Microsoft","Brett" 
"Microsoft","David" 
"Amazon","Watson" 

我能寫腳本如下:

jq -r "[.results[0].name,.results[0].employees[0].name]|@csv" IP.txt 

"Google","Michael" 

"Amazon","Watson" 

有人能指導我寫劇本沒有硬編碼的索引值?

腳本應該能夠產生任何數字results和任何公司的每個cotaining信息的輸出。

我試着用下面的腳本並沒有產生預期的輸出:

jq -r "[.results[].name,.results[].employees[].name]|@csv" IP.txt 
"Google","Microsoft","Michael","Laura","Elise","Brett","David" 
"Amazon","Watson" 

回答

2

您需要首先拼合下來結果公司和員工姓名的行。然後用這個,你可以轉換成csv行。

map(.results | map({ cn: .name, en: .employees[].name } | [ .cn, .en ])) | add[] | @csv 

既然你的輸入流,你就必須發出聲音(-s)它。既然你要輸出CSV,你要使用原始輸出(-r)。

+0

謝謝傑夫。這工作完美。你能告訴我在哪裏可以學習JQ以瞭解這個腳本的工作原理嗎?我通過JQ手冊。它有助於單個過濾器。我想學習如何將它們混合在一起,創造出魔幻般的解決方案。 – Swapnil

+1

我可以給你的最好的建議是要知道所有可用的過濾器,並瞭解它們可以用於和使用它們。請注意過濾器產生的類型,無論是單個值(數字,對象,數組等)還是多個值(使用[])以及它們如何影響最終結果。功能性編程或其他聲明式編程風格的強大背景是一大優勢。只要玩它,它會在你身上成長。我剛剛在幾個月前就發現了這一點,但在那段時間內,我覺得我已經足夠了解所有事情。 –