PostgreSQL COPY FROM csv - csv格式化问题

时间:2017-11-06 18:34:33

标签: sql postgresql csv vim

我有一个csv文件,我正试图导入我的PostgreSQL数据库(第10版)。我使用以下基本SQL语法:

COPY table (col_1, col_2, col_3)
FROM '/filename.csv'
DELIMITER ',' CSV HEADER
QUOTE '"'
ESCAPE '\';

导入前30,000行左右没有任何问题。但后来我开始遇到破坏导入的csv文件中的格式问题:

  • 双引号双引号:“value_1”,“”value_2“”,“value_3”或“value_1”,“val”ue_2“,”value_3“

我得到的典型错误是

ERROR: extra data after last expected column

所以我开始使用Vim手动编辑csv文件(csv文件有近700万行,所以真的不能想到另一个桌面工具使用)

  • 我可以用SQL语法处理那些格式错误的字符串吗?使用替代的ESCAPE条款?使用正则表达式?
  • 您能想到在Vim中处理这些格式问题或使用其他工具或功能的方法吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

请注意,该文件不符合the CSV specification:

  
      
  1. 如果使用双引号括起字段,则使用双引号      出现在一个字段内必须通过前面的方式进行转义      另一个双引号。
  2.   

您应指定双引号以外的引号,例如' |':

create table test(a text, b text, c text);

copy test from '/data/example.csv' (format csv, quote '|');

select * from test;

     a     |      b      |     c     
-----------+-------------+-----------
 "value_1" | ""value_2"" | "value_3"
 "value_1" | "val"ue_2"  | "value_3"
(2 rows)

您可以使用trim()replace()函数删除不需要的双引号,例如:

update test
set a = trim(a, '"'), b = trim(b, '"'), c = trim(c, '"');

select * from test;

    a    |    b     |    c    
---------+----------+---------
 value_1 | value_2  | value_3
 value_1 | val"ue_2 | value_3
(2 rows)