我有一个csv文件,我需要加载到postgres。
值看起来像
Date, Col1, Col2, Col3, Col4
20140101,value1, value2, value3, "http//,bar"
20130102,value1, value2, value3, "http//,bar"
20130103,value1, value2", value3, "http//,XXX"
在我的一些数据中(如第3行所示)我有一些不良数据,其中value2
在其末尾有双引号。
不幸的是我无法控制输入数据。
使用postgres COPY命令“as csv”我收到错误的未终止报价。
我无法删除文件中的所有引号,因为最后一列4的值中嵌入了逗号,而逗号是我的分隔符。
基本上我正在寻找的是某种类型的SED脚本,可以删除所有出现的双引号UP,直到第一次出现“http // .....最后一列总是有”http // “因此我很好地将其用作常数。
在上面的示例中,第1行和第2行是正确的。第3行应该从
改变20130103,value1, value2", value3, "http//,XXX"
到
20130103,value1, value2, value3, "http//,XXX"
答案 0 :(得分:0)
使用perl会更容易,因为它支持前瞻:
perl -pe 's/"(?=.*?"http)//g' file.csv
Date, Col1, Col2, Col3, Col4
20140101,value1, value2, value3, "http//,bar"
20130102,value1, value2, value3, "http//,bar"
20130103,value1, value2, value3, "http//,XXX"
或使用awk:
awk -F'"http' 'index($1, "\"") { gsub(/"/, "", $1); $1=$1 FS } 1' file
Date, Col1, Col2, Col3, Col4"http
20140101,value1, value2, value3, "http //,bar"
20130102,value1, value2, value3, "http //,bar"
20130103,value1, value2, value3, "http //,XXX"
答案 1 :(得分:0)
这可能适合你(GNU sed):
sed -r ':a;s|"(.*"http//)|\1|;ta' file