JQ解析CSV-如何跳过标题

时间:2018-09-24 18:13:51

标签: csv jq

我有一个CSV,需要将CSV转换为简单的换行符分隔的格式,以供输入另一个脚本中,但遇到一个奇怪的问题。

CSV内容:

"1. ID","2. Height","3. Gender","4. Age"
"<1111111111>","5ft. 10.0in.","M"," 15.0"
"<2222222222>","6ft. 0in.","M"," 22.0"

CLI命令的版本1:

cat source.csv | sed 's/[\"<>]//g' | ~/projects/dp/vendor/jq/1.5/jq --raw-input --compact-output 'split("\n") | .[1:] | map(split(",")) | map({"phone_number":.[0],"opt_in":"yes"}) | .[]'

第1版输出:无

CLI命令的版本2:

cat source.csv | sed 's/[\"<>]//g' | ~/projects/dp/vendor/jq/1.5/jq --raw-input --compact-output 'split("\n") | .[0:] | map(split(",")) | map({"phone_number":.[0],"opt_in":"yes"}) | .[]'

第2版输出:

{"phone_number":"1. ID","opt_in":"yes"}
{"phone_number":"1111111111","opt_in":"yes"}
{"phone_number":"2222222222","opt_in":"yes"}

据我了解,。[1:]告诉JQ仅解析行#1之后的行(用新行分隔),但是行#1将指示引用(能够引用phone_number)。

那么版本1为什么不输出任何内容?

1 个答案:

答案 0 :(得分:2)

版本1缺少-s命令行选项。

跳过标题行的另一种方法是不使用inputs命令行选项而使用-n,如下所示。与使用inputs命令行选项相比,使用-s的效率也要高得多。

< source.csv sed 's/[\"<>]//g' |
jq -cR 'inputs 
      | split(",")
      | {"phone_number":.[0],"opt_in":"yes"}'

健壮

使用jq解析CSV文件充满了潜在的困难。通常,最好使用“ csv2tsv”工具将CSV转换为jq可以轻松处理的TSV。