在bash中将CSV转换为JSON [英] Converting CSV to JSON in bash
本文介绍了在bash中将CSV转换为JSON的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
尝试将CSV文件转换为JSON
Trying to convert a CSV file into a JSON
这是两个示例行:
-21.3214077;55.4851413;Ruizia cordata
-21.3213078;55.4849803;Cossinia pinnata
我想得到类似的东西:
"occurrences": [
{
"position": [-21.3214077, 55.4851413],
"taxo": {
"espece": "Ruizia cordata"
},
...
}]
这是我的脚本:
echo '"occurences": [ '
cat se.csv | while read -r line
do
IFS=';' read -r -a array <<< $line;
echo -n -e '{ "position": [' ${array[0]}
echo -n -e ',' ${array[1]} ']'
echo -e ', "taxo": {"espece":"' ${array[2]} '"'
done
echo "]";
我得到的结果很奇怪:
"occurences": [
""position": [ -21.3214077, 55.4851413 ], "taxo": {"espece":" Ruizia cordata
""position": [ -21.3213078, 55.4849803 ], "taxo": {"espece":" Cossinia pinnata
我的代码有什么问题?
What is wrong with my code ?
推荐答案
此工作的正确工具是 jq
.
The right tool for this job is jq
.
jq -Rsn '
{"occurrences":
[inputs
| . / "\n"
| (.[] | select(length > 0) | . / ";") as $input
| {"position": [$input[0], $input[1]], "taxo": {"espece": $input[2]}}]}
' <se.csv
发出提示后,发出
emits, given your input:
{
"occurences": [
{
"position": [
"-21.3214077",
"55.4851413"
],
"taxo": {
"espece": "Ruizia cordata"
}
},
{
"position": [
"-21.3213078",
"55.4849803"
],
"taxo": {
"espece": "Cossinia pinnata"
}
}
]
}
顺便说一句,原始脚本的较宽松版本看起来像:
By the way, a less-buggy version of your original script might look like:
#!/usr/bin/env bash
items=( )
while IFS=';' read -r lat long pos _; do
printf -v item '{ "position": [%s, %s], "taxo": {"espece": "%s"}}' "$lat" "$long" "$pos"
items+=( "$item" )
done <se.csv
IFS=','
printf '{"occurrences": [%s]}\n' "${items[*]}"
注意:
- 使用
cat
进入循环绝对没有意义(并且没有这样做的充分理由);因此,我们使用重定向(<
)作为循环的stdin直接打开文件. -
read
可以传递一个目标变量列表.因此,不需要读入数组(或者先读入一个字符串,然后生成一个异位并从中读入一个数组).最后的_
确保丢弃多余的列(通过将它们放入名为_
的虚拟变量中),而不是附加到pos
. -
"${array[*]}"
通过将array
的元素与IFS
中的字符连接来生成字符串.因此,我们可以使用它来确保仅在需要时才在输出中出现逗号.
如 - 由于它是通过字符串串联生成JSON的,因此它仍然是固有的错误.不要使用它.
echo
本身的规范.
- There's absolutely no point using
cat
to pipe into a loop (and good reasons not to); thus, we're using a redirection (<
) to open the file directly as the loop's stdin. read
can be passed a list of destination variables; there's thus no need to read into an array (or first to read into a string, and then to generate a heresting and to read from that into an array). The_
at the end ensures that extra columns are discarded (by putting them into the dummy variable named_
) rather than appended topos
."${array[*]}"
generates a string by concatenating elements ofarray
with the character inIFS
; we can thus use this to ensure that commas are present in the output only when they're needed.printf
is used in preference toecho
, as advised in the APPLICATION USAGE section of the specification forecho
itself.- This is still inherently buggy since it's generating JSON via string concatenation. Don't use it.
这篇关于在bash中将CSV转换为JSON的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文