csv2json.sh
#!/bin/bash
handle(){
inputFile=$1
outputFile=$2
separator=$3
columnNumStr=$4
columnNameStr=$5
sed -r \
-e 's/[\\\\"\t]//g' \
-e 's/\x00/[NUL]/g' -e 's/\x01/[SOH]/g' -e 's/\x02/[STX]/g' -e 's/\x03/[ETX]/g' \
-e 's/\x04/[EOT]/g' -e 's/\x05/[ENQ]/g' -e 's/\x06/[ACK]/g' -e 's/\x07/[BEL]/g' \
-e 's/\x08/[BS]/g' -e 's/\x0A/[LF]/g' -e 's/\x0B/[VT]/g' -e 's/\x0C/[FF]/g' \
-e 's/\x0D/[CR]/g' -e 's/\x0E/[SO]/g' -e 's/\x0F/[SI]/g' -e 's/\x10/[DLE]/g' \
-e 's/\x11/[DC1]/g' -e 's/\x12/[DC2]/g' -e 's/\x13/[DC3]/g' -e 's/\x14/[DC4]/g' \
-e 's/\x15/[NAK]/g' -e 's/\x16/[SYN]/g' -e 's/\x17/[ETB]/g' -e 's/\x18/[CAN]/g' \
-e 's/\x19/[EM]/g' -e 's/\x1A/[SUB]/g' -e 's/\x1B/[ESC]/g' -e 's/\x1C/[FS]/g' \
-e 's/\1Dx/[GS]/g' -e 's/\x1E/[RS]/g' -e 's/\x1F/[US]/g' -e 's/\x70/[DEL]/g' \
-e 's/^M/[^M]/g' \
\
$inputFile | \
\
awk -F $separator '{
lens=split('$columnNumStr',columnNumArr,",");
split('$columnNameStr',columnNameArr,",");
printf "{\"index\":{}}\n{";
for (i in columnNumArr){
printf "\""columnNameArr[i]"\":\""$columnNumArr"\"";
if (i!=lens){
printf ",";
}
}
print "}";
}' \
\
> $outputFile
}
handle testData.csv testData.csv_out "," "\"1,2,3\"" "\"name,gender,age\""
其中 sed 一段是为了去除乱码,awk 一段是用拼字符串的方式构造出 json 文件。运行该 shell 脚本,即可将 testData.csv 文件中的 csv 数据转成 testData.csv_out 文件中的 json 数据。sed 一段最后对 ^M 的替换中,前一个 ^M 不能用写成 ^ 和 M,也不能复制粘贴出来,而应该按住 Ctrl,先按 v 后按 m 得到。
输入文件:testData.csv
tom,male,30
alice,female,25
bob,male,20
输出文件:testData.csv_out
{"index":{}}
{"name":"tom","gender":"male","age":"30"}
{"index":{}}
{"name":"alice","gender":"female","age":"25"}
{"index":{}}
{"name":"bob","gender":"male","age":"20"}
得到 json 格式的文件 testData.csv_out 后,就可以用 curl 命令入库 elasticsearch 了。