使用Shell将大型CSV转换为固定记录的多个JSON数组(例如100个记录JSON数组)
如何通过SHELL脚本或命令行将大型CSV转换为固定记录集的JSON数组(100条记录的JSON数组) 例如,输入CSV文件:使用Shell将大型CSV转换为固定记录的多个JSON数组(例如100个记录JSON数组),json,bash,shell,csvtojson,Json,Bash,Shell,Csvtojson,如何通过SHELL脚本或命令行将大型CSV转换为固定记录集的JSON数组(100条记录的JSON数组) 例如,输入CSV文件: identifier,type,locale 91617676848,MSISDN,es_ES 91652560975,MSISDN,es_ES 91636563675,MSISDN,es_ES 预期产出: 1.json (json array having 100 array records) [ { "identifier": "91617676
identifier,type,locale
91617676848,MSISDN,es_ES
91652560975,MSISDN,es_ES
91636563675,MSISDN,es_ES
预期产出:
1.json (json array having 100 array records)
[
{
"identifier": "91617676848",
"type": "MSISDN",
"locale": "es_ES"
},
.
.
.
.
{
"identifier": "91652560975",
"type": "MSISDN",
"locale": "es_ES"
}
]
2.json (json array having 100 array records)
[
{
"identifier": "91636563675",
"type": "MSISDN",
"locale": "es_ES"
},
.
.
.
.
{
"identifier": "91636563999",
"type": "MSISDN",
"locale": "es_ES"
}
]
我创建了一个简单的php脚本(我称之为
converter.php
)
您可以按原样调用:php converter.php test.csv
其中test.csv包含默认csv数据,第一行作为标题
<?php
// open the file passed as parameter
// Ex: php converter.php test.csv
// Where test.csv contains the data passed on question
if (($handle = fopen($argv[1], 'r')) !== false) {
$count = 0;
$lines = [];
while (($data = fgetcsv($handle, 0, ',', '\'')) !== false) {
if ($count == 0) {
$headers = $data;
} else {
$lines[] = array_combine($headers, $data);
}
$count++;
}
// Here, separate in array of arrays with 100 elements on each
// On test i used 2 on second parameter of array_chunk to test with your toy data
$groups = array_chunk($lines, 100);
foreach ($groups as $key => $group) {
file_put_contents('json_data-'.$key.'.json', json_encode($group));
}
}
请尝试awk
解决方案:
awk -v bs=10 '
NR == 1 {
cols = split($0, header, ",")
next
}
{
if ((NR - 1) % bs == 1) {
file = sprintf("%d.json", ++n)
print "[\n {" > file
} else {
print ",\n {" >> file
}
split($0, a, ",")
for (i = 1; i <= cols; i++) {
printf(" \"%s\": \"%s\"", header[i], a[i]) >> file
print (i < cols) ? "," : "" >> file
}
printf "%s", " }" >> file
}
(NR - 1) % bs == 0 {
print "\n]" >> file
close(file)
}
END {
if ((NR - 1) % bs != 0) print "\n]" >> file
}
' input.csv
awk-v bs=10'
NR==1{
cols=拆分($0,标题,“,”)
下一个
}
{
如果((NR-1)%bs==1){
file=sprintf(“%d.json”,++n)
打印“[\n{”>文件
}否则{
打印“,\n{”>>文件
}
拆分($0,a,“,”)
对于(i=1;i>文件
打印(i>文件
}
printf“%s”,“}”>>文件
}
(NR-1)%bs==0{
打印“\n]”>>文件
关闭(文件)
}
结束{
如果((NR-1)%bs!=0)打印“\n]”>>文件
}
'input.csv
变量bs
包含每个文件的多个数组。
它逐行处理输入文件,并有许多条件分支来生成正确的json文件。叹气。使用bash
实现,可以通过从文件(2-101、102-201,…)重复切片行范围来完成任务下面的代码使用sed
提取行,并使用csvjson
将每个块格式化为JSON
您可以替换您喜爱的任何工具(csv到json的替代方案很少)
所需的代码要稍微详细一些
#! /bin/sh
csv=$1
lines=$(wc -l < $csv)
blocks=$((1+(lines-1)/100))
for (( i=1 ; i <= blocks ; i++ )) ; do
sed -ne "1p;$((i*100-98)),$((i*100+1))p" $csv | csvjson -i2 > $i.json
done
!/bin/sh
csv=1美元
行=$(wc-l<$csv)
块=$((1+(第1行)/100行))
对于((i=1;i$i.json)
完成
假设文件大小合理,重新处理输入文件不会产生大量开销