使用Bash的jq工具将CSV转换为指定JSON格式的问题求助
问题:将CSV转换为指定结构的JSON
需要把CSV文件内容转换为包含configuration键的JSON结构,具体要求如下:
输入CSV内容(output.csv)
cat output.csv "k","a1",1,"b1","c1","d1",1 "l","a2",2,"b2","c2","d2",2 "m","a3",3,"b3","c3","d3",3 "n","a4",4,"b4","c4","d4",4 "o","a5",5,"b5","c5","d5",5
期望的JSON输出
{ "configuration": { "k": { "a": "a1", "number1": "1", "c": "b1", "d": "c1", "e": "d1", "number2": "1" }, "l": { "a": "a2", "number1": "2", "c": "b2", "d": "c2", "e": "d2", "number2": "2" }, ... } }
当前尝试的jq脚本(api.jq)
cat api.jq [ inputs | split(",") | map(ltrimstr("\"")) | map(rtrimstr("\"")) | { a: .[1], number1: .[2], c: .[3], d: .[4], e: .[5], number2: .[6] } ] | {configuration: .}
错误输出
执行命令 jq -nRf api.jq output.csv 后得到的结果不符合预期,生成的是数组而非嵌套对象:
{ "configuration": [ { "a": "a1", "number1": "1", "c": "b1", "d": "c1", "e": "d1", "number2": "1" }, {"a": "a2", "number1": "2", "c": "b2", "d": "c2", "e": "d2", "number2": "2"}, {"a": "a3", "number1": "3", "c": "b3", "d": "c3", "e": "d3", "number2": "3"}, {"a": "a4", "number1": "4", "c": "b4", "d": "c4", "e": "d4", "number2": "4"}, {"a": "a5", "number1": "5", "c": "b5", "d": "c5", "e": "d5", "number2": "5"} ] }
解决方案
现有脚本的核心问题是把处理后的对象存入了数组,但需求是用CSV第一列的值作为键的嵌套对象。修改后的jq脚本如下:
cat api.jq reduce inputs as $line ({}; ($line | split(",") | map(gsub("^\"|\"$"; ""))) as $fields | .[$fields[0]] = { a: $fields[1], number1: $fields[2], c: $fields[3], d: $fields[4], e: $fields[5], number2: $fields[6] } ) | {configuration: .}
改动说明:
- 用
reduce遍历每一行,逐步构建以CSV第一列值为键的对象,替代原有的数组存储方式 - 用
gsub("^\"|\"$"; "")简化引号去除逻辑,替代两次map调用 - 确保顶层键为
configuration,符合需求格式
执行命令:
jq -nRf api.jq output.csv
正确输出:
{ "configuration": { "k": { "a": "a1", "number1": "1", "c": "b1", "d": "c1", "e": "d1", "number2": "1" }, "l": { "a": "a2", "number1": "2", "c": "b2", "d": "c2", "e": "d2", "number2": "2" }, "m": { "a": "a3", "number1": "3", "c": "b3", "d": "c3", "e": "d3", "number2": "3" }, "n": { "a": "a4", "number1": "4", "c": "b4", "d": "c4", "e": "d4", "number2": "4" }, "o": { "a": "a5", "number1": "5", "c": "b5", "d": "c5", "e": "d5", "number2": "5" } } }
内容的提问来源于stack exchange,提问作者L_sama
相关产品推荐
相关产品推荐

