2017-08-08 50 views
1

在JQ使用$變量我使用這個代碼:從PowerShell的

jq --raw-output "(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv" output2.json > output3.csv 

從我的JSON數據庫中創建CSV:

[ 
    { 
    "key1": "field1", 
    "key2": "field2", 
    "key3": "field3" 
    }, 
    { 
    "key1": "field4", 
    "key2": "field5", 
    "key3": "field6" 
    } 
] 

輸出是完美的https://jqplay.org/,但似乎並不在我的命令行上運行時都可以工作。 我在VSCode中使用PowerShell。

我不斷收到此錯誤。

 
jq: error: syntax error, unexpected '|', expecting '$' or '[' or '{' (Windows cmd shell quoting issues?) at , 
line 1: (map(keys) | add | unique) as | map(. as | | map([.])) as | , [] | @csv 
jq: 1 compile error 

我猜的$是問題,因爲它們不是在錯誤的文字顯示,所以我試圖以各種方式逃避他們,但沒有取得進展。 我已經廣泛搜索,沒有人似乎有這個問題,所以我必須得到非常簡單的非常錯誤的東西。

+0

你路過這整條生產線中作爲一個字符串,或者它是什麼?您需要將其作爲字符串傳遞並轉義|字符。您還需要注意powershell語法:$表示在cmd窗口中執行命令。 – jmoon

回答

3

jq腳本:

  • 必須作爲一個文字 PowerShell的字符串('...'傳遞,
  • 因爲 PowerShell的字符串("...")的設計詮釋$ -prefixed令牌爲PowerShell變量引用;例如,$cols(或PowerShell的子表達式$(...)),這並不適用於這種情況):
jq -r '(map(keys) | add | unique) as $cols | 
     map(. as $row | $cols | map($row[.])) as $rows | 
     $cols, $rows[] | @csv' output2.json > output3.csv 

*我添加換行符以提高可讀性。 PowerShell字符串文字可以跨越多行,因此您應該可以按原樣粘貼多行命令。當然,你可以將它格式化爲一行。
* -r確保結果輸出爲「原始」,即沒有JSON值轉義。
*如果保存jq腳本到文件-f選項一起使用時,請務必將其保存爲UTF-8 沒有BOM


以下是一個演示區別一個簡單的例子:

# OK: SINGLE-quoted jq script: 
PS> '{ "foo": "bar" }' | jq '. as $cols | .foo' 
"bar" 

# BROKEN: DOUBLE-quoted jq script: PowerShell expands `$cols` up front, 
#   resulting in an empty string, if no such PowerShell variable exists. 
#   jq then effectively sees '. as | .foo', which explains the syntax error. 
PS> '{ "foo": "bar" }' | jq ". as $cols | .foo" 
jq: error: syntax error, unexpected '|', expecting '$' or '[' or '{' (Unix shell quoting issues?) at <top-level>, line 1: 
. as | .foo  
jq: 1 compile error 
+0

解決了。這另一個問題的問題是編碼。 jq需要沒有BOM的UTF-8。其他任何事情都會引發錯誤。 標記爲已解決。謝謝! – kobuta23

2

作爲參考,當我把你的(略格式化)過濾器在一個名爲filter.jq

(map(keys) | add | unique) as $cols 
| map(. as $row | $cols | map($row[.])) as $rows 
| $cols, $rows[] 
| @csv 

,並在一個名爲json.data和文件數據文件運行

jq -r -f filter.jq json.data 

我看到下面的輸出

"key1","key2","key3" 
"field1","field2","field3" 
"field4","field5","field6" 

所以問題可能出現在你正在運行的確切命令。沒有看到很難說,但將你的過濾器放在一個單獨的文件中可能會阻止任何命令行引用/轉義問題。