json 按值对csv数据分组

a9wyjsp7  于 2022-12-20  发布在  其他
关注(0)|答案(3)|浏览(111)

我有一个CSV,如下所示:

created,id,value
2022-12-16 11:55,58,10
2022-12-16 11:55,59,2
2022-12-16 11:50,58,11
2022-12-16 11:50,59,3
2022-12-16 11:50,60,7

我想解析它,这样就得到了以下结果,将id设置为列并按日期分组:

created,58,59,60
2022-12-16 11:55,10,2,nan
2022-12-16 11:50,11,3,7

缺失值设置为nan,每个ID在每个日期最多出现一次
我该怎么做呢?如果用jq更容易的话,我还有第一个JSON等价的CSV
JSON由类似的元素组成:

{ 
  "created": "2022-12-16 09:15", 
  "value": "10.4", 
  "id": "60" 
}
zbdgwd5y

zbdgwd5y1#

下面是我在jq中基于JSON输入流的实现方式:

reduce inputs as {$created, $value, $id} ({head: [], body: {}};
  .head |= (.[index($id) // length] = $id) | .body[$created][$id] = $value
)
| (.head | sort_by(tonumber)) as $head | ["created", $head[]], (
  .body | to_entries[] | [.key, .value[$head[]]]
)

然后,使用@csv内置函数,将值括在引号中,并为缺少的组合生成空值:
x一个一个一个一个x一个一个二个x
Demo
或者通过map ping和join ing手动生成nan,
一个三个三个一个
Demo

8aqjt8rx

8aqjt8rx2#

试用脚本:

cat xtmp.txt | sort | sed -e 's\,\\g' | awk '{if(!a[$1" "$2]){a[$1" "$2]=$4;b[$1" "$2]=c[$1" "$2]="nan"};z[$1" "$2]+=1;if(z[$1" "$2]==2){b[$1" "$2]=$4}else if (z[$1" "$2]==3){c[$1" "$2]=$4}}END{for(i in a) printf  "%s, %s, %s, %s \n", i, a[i], b[i], c[i]}'
9gm1akwq

9gm1akwq3#

使用强大的Miller(版本〉= 6),运行

mlr --csv reshape -s id,value then unsparsify then fill-empty -v "nan" input.csv

你得到

created,58,59,60
2022-12-1611:55,10,2,nan
2022-12-1611:50,11,3,7

这里的核心命令是reshape -s id,value,用于将输入从长结构转换为宽结构。

相关问题