【问题标题】:Convert JSON Objects to JSON object array Without programming Language (exception shell scripting)将 JSON 对象转换为 JSON 对象数组,无需编程语言(异常 shell 脚本)
【发布时间】:2021-08-30 15:49:48
【问题描述】:

我有包含多个 JSON 对象的文件,需要将它们转换为 JSON。我安装了 bash 和 Excel,但无法安装任何其他工具。

{"name": "a","age":"17"}
{"name":"b","age":"18"}

收件人:

[{"name": "a","age":"17"},
{"name":"b","age":"18"}]

【问题讨论】:

  • jq 是一个选项吗?
  • @SimpleNiko 没有编程语言和 windows 环境。
  • 用编程语言是小菜一碟。帮助我们了解您。 #1 你有一个单元格中带有 json 文本的 excel? #2 据我所知,json 不支持 json 作为对象,因此对于 excel,此单元格只是一个文本。如果是文本,为什么不手动添加(因为你不需要编程语言)或者用excel函数,[ ]将其转换为数组? #3 也许你的方法可以改进。你真正的需求是什么?在数据库中批量处理 excel?使用 excel 创建网页?等
  • 也许你的意思是“我已经安装了bash 和 Excel,但无法安装任何其他工具。”

标签: json excel bash shell excel-import


【解决方案1】:

假设每行一个对象,如 OP 问题所示

echo -n "["; while read line; do echo "${line},"; done < <(cat test.txt) | sed -re '$ s/(.*),/\1]/'

结果:

[{"name": "a","age":"17"},
{"name":"b","age":"18"}]

【讨论】:

  • 如果您要使用sed,则不需要bash 循环。 sed '1s/^/[/;2,$s/^/,/;$s/$/]/' 就足够了。
  • 谢谢@chepner :-) 现在你展示它看起来很容易。我对sed不是很流利
  • 它适用于任何文件结构(任意数量的键值对)
  • 可以,只要对象在一行中。
【解决方案2】:

灵感来自https://askubuntu.com/a/475804

awk '(NR==FNR){count++} (NR!=FNR){ if (FNR==1) printf("["); printf("%s", $0); print (FNR==count)?"]":"," } END {if (count==0) print "[]"}' file file

一个不太紧凑但更易读的版本:

awk '
  (NR==FNR) {
    count++;
  }
  (NR!=FNR) {
    if (FNR==1)
      printf("[");
    printf("%s", $0);
    if (FNR==count)
      print "]";
    else
      print ",";
  }
  END {
    if (count==0) print "[]";
  }' file file

诀窍是将同一个文件两次提供给awk。因为NR==FNR 对于第一个文件总是正确的,所以有一个专门用于计算变量count 中的行数的第一个解析。

NR!=FNR 的第二次解析将对每一行应用以下算法:

  • 只在第一行写[
  • 然后写入记录,使用printf而不是print以避免换行符结束
  • 然后根据我们是否在最后一行写入],,使用print 以换行符结尾

END 命令只是在文件为空的情况下输出空数组的故障保护。

【讨论】:

    【解决方案3】:

    假设:

    • 无需(重新)格式化输入数据

    示例输入:

    $ cat raw.dat
    {"name": "a","age":"17"}
    {"name":"b","age":"18"}
    {"name":"C","age":"23"}
    

    一个awk想法:

    awk 'BEGIN {pfx="["} {printf "%s%s",pfx,$0; pfx=",\n"} END {printf "]\n"}' raw.dat
    

    地点:

    • 对于每个输入行,我们printf没有终止换行
    • 对于第一行,我们使用前缀 (pfx) [
    • 对于后续行,前缀 (pfx) 设置为 ,\n(即,previous 行以 ,\n 结束)
    • 处理完文件后,我们会使用printf "]\n" 终止last 输入行
    • 需要单次通过输入文件

    这会生成:

    [{"name": "a","age":"17"},
    {"name":"b","age":"18"},
    {"name":"C","age":"23"}]
    

    确保@chepner 的评论(回复:sed 解决方案)不会丢失:

    sed '1s/^/[/;2,$s/^/,/;$s/$/]/' raw.dat
    

    这会生成:

    [{"name": "a","age":"17"}
    ,{"name":"b","age":"18"}
    ,{"name":"C","age":"23"}]
    

    注意:如果@chepner 想将此作为答案发布,我可以将其删除。

    【讨论】:

      猜你喜欢
      • 2012-07-21
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      • 2018-09-12
      相关资源
      最近更新 更多