使用Shell脚本清理CSV:移除冗余字符并修复损坏行
Shell脚本处理损坏CSV并清理内容的方案
作为Shell新手,处理这种乱掉的CSV确实挺闹心的——既要清理特殊字符、空行,还要把连在一起的记录拆分开,还要保证后续Scala能正常处理。我给你整了一套用系统自带工具实现的方案,简单好懂,直接就能用:
先明确要搞定的事儿
- 删掉所有
*号和那些\xC2\xA0格式的非换行空格 - 把空行全部移除,避免Scala报错
- 修复那些连在一起的损坏行,恢复每行
ID, 内容的CSV结构
完整脚本代码
把下面的代码存成clean_csv.sh文件就行:
#!/bin/bash # 替换成你的输入CSV路径 INPUT_FILE="your_input.csv" # 处理后的输出文件 OUTPUT_FILE="cleaned_csv.csv" # 核心处理流程:先拆损坏行 → 再清特殊字符 → 最后删空行 awk '{ # 匹配18位数字ID+逗号,在前面加换行拆分记录 gsub(/([0-9]{18}),/, "\n&") print $0 }' "$INPUT_FILE" | \ sed -e 's/\xC2\xA0//g' \ -e 's/\*//g' | \ sed '/^[[:space:]]*$/d' > "$OUTPUT_FILE" echo "搞定!处理好的文件在 $OUTPUT_FILE 里"
每一步都给你讲明白
- awk拆分损坏行:观察你的CSV,所有合法的ID都是18位数字,所以用
gsub把所有18位数字+逗号的组合前面加个换行,这样连在一起的记录就自动拆成单独的行了。&代表匹配到的内容,所以\n&就是在ID前插换行。 - sed清理特殊字符:第一个
sed命令把所有\xC2\xA0(UTF-8的非换行空格)删掉,同时把所有*号也清掉; - sed删除空行:第二个
sed命令把所有空行(包括只有空格的行)都删掉; - 最后把结果存到输出文件里。
怎么用?超简单
- 把你的CSV文件路径替换到脚本里的
INPUT_FILE; - 给脚本加执行权限:
chmod +x clean_csv.sh; - 运行脚本:
./clean_csv.sh; - 处理好的文件就会出现在
OUTPUT_FILE指定的路径里。
测试下损坏行的效果
拿你给的那条损坏行:
902755305158782976, 12z ecmwf setup support major strike east coast high east deep uul west hurricaneirma 902777486186086400, future hurricaneirma satellite look impressive tropicaldepression10 24 hour 903355611810852867 hurricaneirma think 903355611810852868 hurricagggneirma think
经过脚本处理后会变成:
902755305158782976, 12z ecmwf setup support major strike east coast high east deep uul west hurricaneirma 902777486186086400, future hurricaneirma satellite look impressive tropicaldepression10 24 hour 903355611810852867 hurricaneirma think 903355611810852868 hurricagggneirma think
注意:最后两行原来就没有逗号,脚本没法自动补(毕竟没法判断内容和ID的分界),这类行你可能需要手动检查下,但大部分正常的损坏行都能自动修复。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

