【发布时间】:2019-12-11 12:32:12
【问题描述】:
我正在尝试预处理 UTF-8 CSV 文件,以创建 SQL 脚本以在 postgresql 数据库中创建表。 标头来自 Excel,并经过人工优化:
例如:
GKCode,GKCode Neu,Name,Markttyp,Jahr,Leerstandsrate Büro (MFG) (%),Spitzenmiete Büro City (Euro/qm),Durchschnittsmiete Büro City (Euro/qm),Nettoanfangsrendite Büro zentrale Lagen (%),Nettoanfangsrendite Büro dezentrale Lagen (%),Nettoabsorption (qm)
我想做什么:
获取标题(第一行
删除 BOM(如果有)
在每个分隔符之后添加双引号,并在每个分隔符之前添加双引号和“varchar”
在流的开头添加双引号
在流的末尾附加双引号和“varchar”(最后一个 varchar 替换为“### bad append ###”用于测试目的
到目前为止我做了什么:
试图使用文件作为中间文件
尝试使用 echo 和 AWK
我的代码(迄今为止最好的例子):
csv_delimiter=","
head -1 raw_import |sed 's/^\xEF\xBB\xBF//'| sed -e "s|$csv_delimiter|\" varchar$csv_delimiter\"|g"| sed -e "s|$|\" ### bad append ###|g"
我收到了意外的结果,'bad append' 出现在错误的位置:
GKCode" varchar,"GKCode Neu" varchar,"Name" varchar,"Markttyp" varchar,"Jahr" varchar,"Leerstandsrate Büro (MFG) (%)" varchar,"Spitzenmiete Büro City (Euro/qm)" varchar,"Durchschnittsmiete Büro City (Euro/qm)" varchar,"Net" ### bad append ###o zentrale Lagen (%)" varchar,"Nettoanfangsrendite Büro dezentrale Lagen (%)" varchar,"Nettoabsorption (qm)
简单的标题(字母数字)结果稳定
echo "1,wqd15,15,dq5w15,d5qw,4dq,51dqw5d,q51d,qw51d,qw51d,5q,wd,56" |sed '1s/^\xEF\xBB\xBF//'| sed -e "s|$csv_delimiter|\" varchar$csv_delimiter\"|g"| sed -e "s|$|\" varchar|g"
【问题讨论】:
-
输入中有
\r0x0d字符吗?$csv_delimiter=","分配没有$。它应该工作。尝试将head -1的输出通过管道传输到hexdump -C或xxd -p并检查(并发布?)输出。 -
是的,由于某种原因,我几乎在末尾有 0x0d....
head -1 raw_import | hexdump -C | grep 0d00000100 29 0d 0a |)..|我该如何继续? -
你有喜欢的结局。所以我认为它的工作原理是这样的:在
0x0d和0x0a之前插入字符串“bad append”。要么转换为 unix 结尾dos2unix,要么只匹配 0x0ds|\r$|.... -
已经这样做了,不知何故我没有想到,sed 在使用流时可能真的会返回 carret。非常感谢!