加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在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);因此,我们使用重定向(<)直接打开文件作为循环的标准输入.
> read可以传递目标变量列表;因此,不需要读入数组(或者首先读入一个字符串,然后生成一个heresting并从中读取到一个数组中).最后的_确保丢弃额外的列(通过将它们放入名为_的虚拟变量中)而不是附加到pos.
>“${array [*]}”通过将数组元素与IFS中的字符连接来生成字符串;因此,我们可以使用它来确保只有在需要时才在输出中显示逗号.
>正如the specification for echo itself的“应用程序使用”部分所述,printf优先于echo使用.>由于它通过字符串连接生成JSON,因此它本身仍然存在错误.不要使用它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读