我有一个CSV文件,我想把它转换成一个JSON文件,在shell脚本中使用JQ删除CSV中的引号。
下面是名为input.csv的CSV:
1,"SC1","Leeds"
2,"SC2","Barnsley"以下是JQ摘录:
jq --slurp --raw-input --raw-output \
'split("\n") | .[1:] | map(split(",")) |
map({
"ListElementCode": .[0],
"ListElement": "\(.[1]) \(.[2])
})' \
input.csv > output.json这将写入output.json:
[
{
"ListElementCode": "1",
"ListElement": "\"SC1\" \"Leeds\""
},
{
"ListElementCode": "2",
"ListElement": "\"SC2\" \"Barnsley\""
}
]您知道如何删除放在ListElement部件中的两个文本值周围的引号吗?
发布于 2020-07-06 13:43:23
为了只解决最直接的问题,我们可以编写一个函数,如果-和-当它们存在时,它可以去掉引号:
jq -n --raw-input --raw-output '
def stripQuotes: capture("^\"(?<content>.*)\"$").content // .;
[inputs | split(",") | map(stripQuotes) |
{
"ListElementCode": .[0],
"ListElement": "\(.[1]) \(.[2])"
}]
' <in.csv >out.json也就是说,要真正正确地处理CSV,您不能只使用split(","),而只需要在逗号上拆分不是引号内的逗号(并且需要将双倍引号识别为单引号的转义形式)。实际上,我会使用Python而不是jq来完成这项工作--在编写本文时,烹饪书同意认为本机jq代码只适合于“非常简单”的CSV文件。
发布于 2020-07-06 14:26:36
如前所述,Ruby的回答是:
ruby -rjson -rcsv -e '
data = CSV.foreach(ARGV.shift)
.map do |row|
{
ListElementCode: row.first,
ListElement: row.drop(1).join(" ")
}
end
puts JSON.pretty_generate(data)
' input.csv[
{
"ListElementCode": "1",
"ListElement": "SC1 Leeds"
},
{
"ListElementCode": "2",
"ListElement": "SC2 Barnsley"
}
]发布于 2020-07-06 15:50:55
在CSV/JSON中使用适当的珀尔解析器
#!/usr/bin/env perl
use strict; use warnings;
use JSON::XS;
use Text::CSV qw/csv/;
# input.csv:
#1,"SC1","Leeds"
#2,"SC2","Barnsley"
my $vars = [csv in => 'input.csv'];
#use Data::Dumper;
#print Dumper $vars; # display the data structure
my $o = [ ];
foreach my $a (@{ $vars->[0] }) {
push @{ $o }, {
ListElementCode => $a->[0],
ListElement => $a->[1] . " " . $a->[2]
};
}
my $coder = JSON::XS->new->ascii->pretty->allow_nonref;
print $coder->encode($o);输出
[
{
"ListElement" : "SC1 Leeds",
"ListElementCode" : "1"
},
{
"ListElement" : "SC2 Barnsley",
"ListElementCode" : "2"
}
]https://stackoverflow.com/questions/62756705
复制相似问题