gpt4 book ai didi

json - 使用jq将CSV转换为JSON

转载 作者:行者123 更新时间:2023-12-03 14:32:53 24 4
gpt4 key购买 nike

如果您有这样的csv数据集:

name, age, gender
john, 20, male
jane, 30, female
bob, 25, male
你能做到这一点:
[ {"name": "john", "age": 20, "gender": "male"},
{"name": "jane", "age": 30, "gender": "female"},
{"name": "bob", "age": 25, "gender": "male"} ]
仅使用jq?
我发现 this文章显示了我要执行的操作,但是它使用了标题字段到值的“手动”映射。我不需要/不想重命名标题字段,并且有很多。我也不想每次布局更改时都必须更改脚本/命令。
是否可以动态提取 header ,然后使用jq单行将它们与值组合?

最佳答案

简而言之-是的,除了单线的。

jq通常非常适合文本拼写,对于具有正则表达式支持的版本尤其如此。例如,使用正则表达式支持,给定问题语句所需的修整是微不足道的。

由于jq 1.5rc1包含正则表达式支持,并且自2015年1月1日起可用,因此以下程序假定使用jq 1.5版本。如果要使其与jq 1.4一起使用,请参阅两个“对于jq 1.4”注释。

另请注意,该程序不能全面处理CSV。 (有关更通用地处理CSV的类似方法,请参见https://github.com/stedolan/jq/wiki/Cookbook#convert-a-csv-file-with-headers-to-json)

# objectify/1 takes an array of string values as inputs, converts
# numeric values to numbers, and packages the results into an object
# with keys specified by the "headers" array
def objectify(headers):
# For jq 1.4, replace the following line by: def tonumberq: .;
def tonumberq: tonumber? // .;
. as $in
| reduce range(0; headers|length) as $i ({}; .[headers[$i]] = ($in[$i] | tonumberq) );

def csv2table:
# For jq 1.4, replace the following line by: def trim: .;
def trim: sub("^ +";"") | sub(" +$";"");
split("\n") | map( split(",") | map(trim) );

def csv2json:
csv2table
| .[0] as $headers
| reduce (.[1:][] | select(length > 0) ) as $row
( []; . + [ $row|objectify($headers) ]);

csv2json

示例(假设csv.csv是给定的CSV文本文件):
$ jq -R -s -f csv2json.jq csv.csv
[
{
"name": "john",
"age": 20,
"gender": "male"
},
{
"name": "jane",
"age": 30,
"gender": "female"
},
{
"name": "bob",
"age": 25,
"gender": "male"
}
]

关于json - 使用jq将CSV转换为JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29663187/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com