Shell脚本处理CSV:解决值含逗号列拆分问题或替换分隔符为竖线
哈哈,这个坑我踩过!处理CSV最头疼的就是字段里自带分隔符的情况,给你两个实用的解决思路:
方案一:生成符合规范的CSV,保留字段内的逗号
CSV其实是有明确规范的:如果字段里包含逗号、双引号或者换行符,只要把整个字段用双引号包裹,同时把字段内部的双引号替换成两个双引号,就能让表格阅读器正确识别为单个字段。
用awk来处理会比sed更可靠,因为sed处理复杂的字段判断逻辑比较麻烦。你可以写一个简单的awk脚本:
BEGIN { FS="\t"; OFS="," } { # 遍历每一个字段 for (i=1; i<=NF; i++) { # 如果字段包含逗号、双引号或换行,就进行包裹和转义 if ($i ~ /[,"\n]/) { gsub(/"/, "\"\"", $i) # 把单个双引号替换成两个(CSV规范要求) $i = "\"" $i "\"" # 给字段套上双引号 } } print $0 }
使用的时候,把数据库导出的制表符数据通过管道传给这个脚本就行:
# 假设你从数据库导出的原始数据是标准输出,或者存成了input.tsv mysql -u your_user -p your_db -e "SELECT * FROM your_table" | awk -f process_csv.awk > output.csv
这样生成的CSV,打开时带逗号的字段会被当作整体,不会拆分成多列。
方案二:替换分隔符为竖线(|),彻底规避冲突
如果不想折腾CSV的规范,换一个数据里很少用到的分隔符是更简单的办法,比如竖线|(只要你的数据里没这个符号就行)。
直接修改你的sed命令就行:
sed 's/ /|/g' input.tsv > output.psv
(顺便提一句,竖线分隔的文件其实叫PSV,命名成.psv比.csv更规范,不过大部分表格工具也能正常识别)
如果不确定数据里有没有竖线,可以先检查一下:
grep -q "|" input.tsv && echo "警告:数据里包含竖线,建议换用其他分隔符(比如^或~这类冷门符号)"
另外,其实很多数据库导出工具支持直接指定分隔符,比如MySQL可以直接导出竖线分隔的文件,不用事后处理,效率更高:
mysql --batch --raw -u your_user -p your_db -e "SELECT * FROM your_table" --fields-terminated-by="|" > output.psv
内容的提问来源于stack exchange,提问作者shru
相关产品推荐
相关产品推荐

