尝试将CSV文件转换为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)是完全没有意义的;因此,我们使用重定向(<)直接打开文件作为循环的stdin。
read可以传递一个目标变量列表;因此不需要读入数组(或者先读入字符串,然后生成一个heresting并读入数组)。末尾的_确保丢弃额外的列(将它们放入名为_的虚拟变量中),而不是附加到pos中。
"${array[*]}"通过将array的元素与IFS中的字符连接来生成字符串;因此,我们可以使用它来确保只有在需要逗号时才在输出中出现逗号。
printf优先于echo使用,如the specification for echo itself的应用程序使用部分所述。
这仍然是天生的错误,因为它是通过字符串连接生成JSON的。别用它。

08-27 14:24