【问题标题】:Linux adds string not at wrong place (using echo, sed, cat) [duplicate]Linux在错误的地方添加字符串(使用echo,sed,cat)[重复]
【发布时间】: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)

我想做什么:

  1. 获取标题(第一行

  2. 删除 BOM(如果有)

  3. 在每个分隔符之后添加双引号,并在每个分隔符之前添加双引号和“varchar”

  4. 在流的开头添加双引号

  5. 在流的末尾附加双引号和“varchar”(最后一个 varchar 替换为“### bad append ###”用于测试目的

到目前为止我做了什么:

  1. 试图使用文件作为中间文件

  2. 尝试使用 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"

【问题讨论】:

  • 输入中有\r 0x0d 字符吗? $csv_delimiter="," 分配没有$。它应该工作。尝试将head -1 的输出通过管道传输到hexdump -C xxd -p 并检查(并发布?)输出。
  • 是的,由于某种原因,我几乎在末尾有 0x0d.... head -1 raw_import | hexdump -C | grep 0d 00000100 29 0d 0a |)..| 我该如何继续?
  • 你有喜欢的结局。所以我认为它的工作原理是这样的:在0x0d0x0a 之前插入字符串“bad append”。要么转换为 unix 结尾 dos2unix,要么只匹配 0x0d s|\r$|....
  • 已经这样做了,不知何故我没有想到,sed 在使用流时可能真的会返回 carret。非常感谢!

标签: bash csv sed


【解决方案1】:

感谢 Kamil Cuk,我发现了错误:文件来自 windows 环境,使用 ''' dos2unix raw_import '''

在继续之前,修复错误!!!!!!

【讨论】:

    猜你喜欢
    • 2014-12-18
    • 2013-03-09
    • 2019-12-03
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 2016-05-01
    • 2011-02-20
    相关资源
    最近更新 更多