【问题标题】:How to remove double quotes from column field value of csv file,that is copy to a table in postgreSQL如何从csv文件的列字段值中删除双引号,即复制到postgreSQL中的表
【发布时间】:2019-12-06 11:02:19
【问题描述】:

我在 bash 上使用了\copy parts from home/sherin_ag/parts.csv with (format csv, header false) 这个命令,问题出在 csv 列值中包含字符之间的双引号的行上

示例: "35387","20190912","X99","1/4" KEYWAY","KEYWAY","1","FORD"

问题是 "1/4" KEYWAY" 它在 1/4 之后包含双引号 所以我得到了一个类似

的错误

错误:未终止的 CSV 引用字段

【问题讨论】:

  • csv无效,如果字段中有引号,必须转义。无论生成什么数据都是问题所在。

标签: sql postgresql csv copy


【解决方案1】:

此 CSV 无效,因为它的记录中有一个未转义的 ",其字符与引号字符相同。正如@404 所说,生成的 csv 文件是问题所在。

话虽如此,您可以在控制台中使用 sed 预先更正文件,例如:

 cat vasher_dummy.txt | sed -r 's/\" /\\"" /g' | psql db -c "COPY t FROM STDIN CSV"

此命令将搜索文件中每次出现的"_(_ 表示空格)并将其替换为转义的"

SELECT * FROM t;
   a   |    b     |  c  |      d       |   e    | f |  g   
-------+----------+-----+--------------+--------+---+------
 35387 | 20190912 | X99 | 1/4\" KEYWAY | KEYWAY | 1 | FORD
(1 Zeile)

如果这不是您文件中的唯一问题,则必须更改 sed 字符串以进行进一步更正。查看 sed 文档。它真的很强大。

更新基于 cmets:OP 需要为每一行设置一个计数器,并且需要过滤掉几行。

nl -ba -nln -s, < vasher_dummy.txt | sed -r 's/\" /\ /g' | grep 'SVCPTS' | psql db -c "COPY t FROM STDIN CSV"

【讨论】:

  • 感谢您的响应。实际上这是我的代码,parts.txt 文件包含 SVCOP,"35387","20190912","X99","","C","8","7.5 ","624.78","225.00","34.93","0.00","0.00","0.00","0.00" SVCPTS,"35387","20190912","X99","1/4" 键槽" ,"KEYWAY","1","1.50","3.00","1.50","3.00","FO","1","FORD" bash 代码为:nl -ba -nln -s, home/sherin_ag/parts.csv psql_local
  • @SherinGreen 您可以将此更新添加到您的问题中吗?只是为了确保我们没有任何格式问题甚至缺少换行符:)
  • 我的文本文件包含每个字段的双引号,但它在复制时工作正常,但问题是当值中出现额外的 " 时
  • @SherinGreen 完全正确。这就是为什么您必须删除这个额外的" 或使用sed 将它们转义到\"
  • nl -ba -nln -s, 主页/sherin_ag/parts.csv | sed -r 's/\" /\\"" /g' psql_local
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 2018-07-27
  • 1970-01-01
相关资源
最近更新 更多