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 了。