CSV文件预处理问题:移除引号竖线及补全缺失引号
竖线分隔CSV文件的预处理解决方案
问题背景
解析以**竖线(|)**为列分隔符、**双引号(")**标记长字符串列的CSV文件时,需要编写预处理脚本完成以下操作:
- 移除字符串中多余的竖线和双引号
- 补全示例中缺失的双引号
示例输入
sample 1|Pending|"XXX LPA. LTD. - GridBird TEST (Monthly) (Collage Maker | Photo Editor)"|749|... sample 2|Pending|"Take Five Entertainment" Limited Liability Partnership - Pack with cats "Halloween" (Cat Simulator: My Pets)|...
期望输出
sample 1|Pending|"XXX LPA. LTD. - GridBird TEST (Monthly) (Collage Maker Photo Editor)"|749|... sample 2|Pending|"Take Five Entertainment Limited Liability Partnership - Pack with cats Halloween (Cat Simulator: My Pets)"|749|...
尝试过的方法
曾尝试用正则表达式识别目标模式,结合sed进行替换,但因对sed运行机制不熟悉,无法仅替换目标字符(竖线或双引号)。使用的正则表达式如下:
^.*\|\".*(\||\").*(\"\|\d|\|\d)
该正则用于匹配|"与("|数字或|数字)之间的字符串,但后续无法用sed完成替换操作。
最终解决方案(感谢@Ed Morton)
以下是基于样本得到的awk预处理脚本,注释已翻译为中文:
{ # 将大括号替换为空格 gsub(/\{/, " "); gsub(/\}/, " "); # 第一步:按双引号分割记录,把引号内字段中的竖线(及周围空格)替换为空格 FS=OFS="\""; $0=$0 for ( i=2; i<=NF; i+=2 ) { gsub(/[[:space:]][|][[:space:]]*/, " ", $i) } # 处理引号内字段中直接连接在字符间的竖线,替换为空格 FS=OFS="\""; $0=$0 for ( i=2; i<=NF; i+=2 ) { if ($i ~ /[#\-\+\?A-Za-z][|][#\-\+\?A-Za-z]*/) { sub(/[|]{1}/, " ", $i) } } # 第二步:按竖线分割记录,移除字段内所有双引号 FS=OFS="|"; $0=$0; for ( i=1; i<=NF; i++ ) { gsub(/"/, "", $i); } print }
内容的提问来源于stack exchange,提问作者macieira
相关产品推荐
相关产品推荐

