Postgres导入双引号值

时间:2014-12-01 14:34:35

标签: postgresql import copy quote

我有一个包含900万行的大型.csv文件。其中一些列包含带引号或其他特殊字符的文本我想从此.csv文件导入数据库。例如,我想导入这一行:

ID   BH   Units       Name                         Type_building      Year_cons
1    4    900.00      schoolgebouw "De Bolster     Schoolgebouw       2014-01-01

如您所见,第四栏中有双引号。 .csv文件中没有引用任何值,但有时会在文本中出现双引号或反斜杠“\”。当我尝试使用以下内容上传数据时

\COPY <tablename> FROM <path to file> WITH CSV DELIMITER ';' NULL '\N';

它给出了一条错误消息:对于类型字符变化(25),ERROR值为long。 显然,它将双引号视为字符串的开头,并尝试将.csv文件(包括第五和第六列)之后的所有内容组合到一个单元格中(这样该单元格将包含'De Bolster Schoolgebouw 2014-01 -01'),不适合,因为'Name'列允许最多25个字符。

我发现了一个类似的主题(Is it possible to turn off quote processing in the Postgres COPY command with CSV format?),其中提供了此解决方案:

\COPY <tablename> FROM <path to file> WITH CSV DELIMITER ';' QUOTE E'\b' NULL '\N';

我认为它的作用是将引用值(默认为双引号)设置为其他内容,在这种情况下为退格,因此它不会再将双引号识别为引号。但是当我运行它时,我得到另一个错误:INVALID整数的输入语法。

现在发生的是每个值都被引用,因此值为“1”的ID变为值“”1“,并且因为ID被定义为整数,所以它将不接受引号。

您是否知道如何将.csv文件中的双引号和其他特殊字符导入postgres数据库?

提前致谢!!

1 个答案:

答案 0 :(得分:1)

根据错误消息,我怀疑它与双引号或任何类型的内容有关 - 如果是这样的话,那将是一个广泛报道的错误并且已经修复了很久以前。< / p>

说到Postgres,错误消息几乎总是正确且有用。因此,要考虑到角色数量远远超出眼睛的真实可能性。

我自己的猜测是,你在某处有一些尾随(或领先)空间,因此在电子表格中查看的数据片段看起来长24个字符,而实际上更长。 / p>

如果你不这样做,我的第二个猜测就是某种奇怪的角色集冲突或影响。也许你有一些双字节字符,或者由于那里的变音符号而表现为单个字符的两个单字符。这些在您用于数据的查看器中看起来很好;但是当这些被解释或被视为utf8时,它们最终会被计为两个不同的角色。不太可能,但可能(example)。

最后,根据弗兰克的建议,尝试删除长度约束。这只会让你放慢速度,因为它会降低插入速度并阻止你向前移动。完成导入后,将约束重新添加到表的定义中。然后,您可以使用以下内容找到有问题的行:

select name from table where length(name) > 24;

...在修复它们之后,如果它有任何用途,您将能够重新添加约束。 (提示:它没有,或者至少不应该有。那里有一个真正的人,名字是:&#34;金正性感光荣的野兽神圣的迪克父亲可爱的铁男人甚至独特的Poh Un Winn Charlie Ghora Khaos Mehan Hansa Kimmy Humbero Uno Master Over Dance Shake Bouti Bepop Rocksteady Shredder Kung Ulf Road House Gilgamesh Flap Guy Theo Ass Hole Im Yoda Funky Boy Slam Duck Chuck Jorma Jukka Pekka Ryan Super Air Ooy Rusell Salvador Alfons Molgan Akta Papa Long Nameh Ek。&#34;)