在bash中将CSV转换为JSON
发布时间:2020-12-16 01:21:32 所属栏目:安全 来源:网络整理
导读:尝试将CS??V文件转换为 JSON 这是两个示例行: -21.3214077;55.4851413;Ruizia cordata-21.3213078;55.4849803;Cossinia pinnata 我想得到类似的东西: "occurrences": [ { "position": [-21.3214077,55.4851413],"taxo": { "espece": "Ruizia cordata" },..
尝试将CS??V文件转换为
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 我的代码出了什么问题?
这项工作的正确工具是
jq .
jq -Rsn ' {"occurrences": [inputs | . / "n" | (.[] | select((. | length) > 0) | . / ";") as $input | {"position": [$input[0],$input[1]],"taxo": {"espece": $input[2]}}]} ' <se.csv 根据您的意见发出: { "occurences": [ { "position": [ "-21.3214077","55.4851413" ],"taxo": { "espece": "Ruizia cordata" } },{ "position": [ "-21.3213078","55.4849803" ],"taxo": { "espece": "Cossinia pinnata" } } ] } 顺便说一句,原始脚本的错误版本可能如下: #!/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管道进入循环是绝对没有意义的(和good reasons not to);因此,我们使用重定向(<)直接打开文件作为循环的标准输入. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |