免责声明:我使用了一个非常简单的例子,认为每个参数都有一些我不知道的隐藏编码。原来我的 格式化是完全错误的。正如@ miken32所说,我应该使用 逗号。我改变了我的格式,它完美无缺。有价值的教训 得知。
我已使用Excel 2013(在Windows上)从csv
导出xlsl
个文件。我通过电子邮件发送了新的csv
文件,并在Unix(MacOS Sierra)上运行这些测试。
考虑以下CSV文件:
John
Adam
Cameron
Jordan
我试图将每一行格式化为:
{'operator':'EQ', 'property':'first_name', 'value':'John'},
{'operator':'EQ', 'property':'first_name', 'value':'Adam'},
{'operator':'EQ', 'property':'first_name', 'value':'Cameron'},
{'operator':'EQ', 'property':'first_name', 'value':'Jordan'}
所以value
是唯一在每一行之间改变的参数。
这是我写的awk
文件:
BEGIN { }
{
print "{'operator':'EQ', 'property':'first_name', 'value':'"$0"'},";
}
END { }
但执行此操作后,我得到的输出是:
{'operator':'EQ', 'property':'first_name', 'value':'John
'},
{'operator':'EQ', 'property':'first_name', 'value':'Adam
'},
请注意,在打印出参数($ 0)后,是否会打印换行符?这搞乱了我的JSON格式。我觉得这与excel导出有关(由Save as .csv
完成)。
有什么建议吗?
答案 0 :(得分:2)
在awk中,$0
代表整行,而$1
,$2
,$n
代表行中的分隔字段。
提供的示例不是CSV文件,因为没有逗号分隔的任何值。如果是,你可以这样做:
awk -F, '{print "{'"'"'operator'"'"':'"'"'EQ'"'"', '"'"'property'"'"':'"'"'first_name'"'"', '"'"'value'"'"':'"'"'"$1"'"'"'},"}' foo.txt
对于shell友好的引用,这有点疯狂!
您应该知道有jq
等工具可用于创建和使用JSON数据。如果这不仅仅是一次性任务,那么您可能会更好地服务于此。
awk -F, '{print "{\047operator\047:\047EQ\047, \047property\047:\047first_name\047, \047value\047:\047"$1"\047},"}' foo.txt
(但是根据您的原始问题,您似乎仍在使用单独的脚本文件,因此您不必担心转义引号。)
答案 1 :(得分:1)
如前所述,基于'
的引用的示例输出不是有效的JSON,只能使用"
。
确保有效的JSON输出是一个很好的理由
使用jq
CLI,这不仅使任务更加健壮,而且还简化了它:
jq -Rnc 'inputs | { operator: "EQ", property: "first_name", value: . }' <<EOF
John
Adam
Cameron
Jordan
EOF
的产率:
{"operator":"EQ","property":"first_name","value":"John"}
{"operator":"EQ","property":"first_name","value":"Adam"}
{"operator":"EQ","property":"first_name","value":"Cameron"}
{"operator":"EQ","property":"first_name","value":"Jordan"}
说明:
-R
读取 R aw输入(输入不是JSON)-n
会禁止自动读取输入,因此可以使用特殊变量input
和inputs
。-c
生成 c ompact输出(不是漂亮打印)inputs
代表所有输入行,|
之后的表达式迭代地将每一行视为.
。{ ... }
的扩展值在输出时转换为JSON。答案 2 :(得分:0)
的Perl:
perl -MJSON -nlE 'push @p,{operator=>"EQ",property=>"first_name",value=>$_}}{say JSON->new->pretty->encode(\@p)' file
输出有效,印刷精美的JSON:
[
{
"operator" : "EQ",
"property" : "first_name",
"value" : "John"
},
{
"operator" : "EQ",
"value" : "Adam",
"property" : "first_name"
},
{
"operator" : "EQ",
"property" : "first_name",
"value" : "Cameron"
},
{
"property" : "first_name",
"value" : "Jordan",
"operator" : "EQ"
}
]
更多可读:
perl -MJSON -nlE '
push @p, { operator=>"EQ", property=>"first_name", value=>$_}
END {
say JSON->new->pretty->encode(\@p)
}' file
如果您生成JSON,最后一点:在JSON
中,不允许使用单引号。