使用Shell将大型CSV转换为固定记录的多个JSON数组(例如100个记录JSON数组)

使用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

如何通过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": "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)
完成
假设文件大小合理,重新处理输入文件不会产生大量开销