在 PostgreSQL 中避免 COPY FROM 出现未被引用的回车符号问题

8
我正在尝试将一个大约4.5GB的CSV文件导入到Postgres中,但它一直抛出以下错误: ERROR: 未在数据中找到引号括起来的回车符 HINT: 使用带引号的CSV字段来表示回车符。 CONTEXT: COPY abc_complete_file_261115, line 9041959
我在SublimeText2中打开了我的CSV文件,并跳转到行9041959,在那里找到了我需要的记录的URN,然后在Vim中加载了该文件并跳转到该行。我在Vim中启用了隐藏字符(使用:set list),因此我希望能够在数据行中看到一个回车符^M,但是我只能在行末找到预期的一个。
经过整整一天的研究,我没有更进一步,最后删除了第9041959行的记录 - 这并没有解决问题。然后我想也许是记录之间发生了奇怪的情况,所以我删除了错位的5条记录,但是它再次给出了相同的错误。(我现在只是想导入文件,以便在Postgres中查看数据,稍后再考虑数据保留问题)。我确保在重新运行查询之前已保存了对CSV文件的更改,但它仍然给出相同的错误。
我感觉自己可能漏掉了非常非常显而易见的东西 - 有人有什么想法可能是什么原因导致了这个问题吗?
我正在使用运行El Capitan的Mac。
CREATE TABLE large_file_test(
urn VARCHAR,
forename CHAR(32),
surname CHAR(32));
COPY large_file_test FROM '/Users/Shared/largefile1.csv' (FORMAT CSV, DELIMITER ',', HEADER, ENCODING LATIN1);
COPY large_file_test FROM '/Users/Shared/largefile2.csv' (FORMAT CSV, DELIMITER ',', HEADER, ENCODING LATIN1);
COPY large_file_test FROM '/Users/Shared/largefile3.csv' (FORMAT CSV, DELIMITER ',', HEADER, ENCODING LATIN1);
ALTER TABLE large_file_test
ADD CONSTRAINT large_urn
PRIMARY KEY (large_urn);
ANALYZE large_file_test;

我正在尝试将三个不同的文件加载到我创建的表中。问题在于第一部分似乎有一些隐藏字符,导致无法将其导入到Postgres中。我还没有尝试过第二部分或第三部分。


展示完整命令应该会有帮助。另外请参考:https://github.com/postgres/postgres/blob/c5ec4064120c12c7b8cd4772d0b9f571f5dd40b4/src/backend/commands/copy.c#L3386 - Jakub Kania
嗨@Sato Katsura,我想知道为什么这个问题与Vim无关,您能否给予建议?我相信我的Postgres查询是正确的,但csv文件没有加载到Postgres中,因为文件中似乎有隐藏字符。我需要使用Vim来删除这些隐藏字符,但是我看不到Postgres所说的隐藏回车符?在我使用Postgres之前,我需要使用Vim,因此Vim不是一个相关的标签吗?非常感谢您的帮助。 - mmTmmR
我在想这是否是一个编码问题。你确定文件使用的是 LATIN1 编码而不是一些多字节编码吗? - user330315
嗨@a_horse_with_no_name - 我一直在想同样的问题。我尝试重新运行查询,但没有Latin1部分,即(FORMAT CSV,DELIMITER',',HEADER);,它给了我以下错误ERROR:invalid byte sequence for encoding "UTF8":0xd82b SQL state:22021 Context:COPY 123_complete_file_261115,line 18982。我真的没有办法找出它是如何编码的 - 有没有办法确定使用了什么编码?非常感谢。 - mmTmmR
嗨@a_horse_with_no_name - 我们发现该文件使用了“MS代码1252(ANSI-Latin I)”,因此不幸的是,看起来“Latin1”应该可以工作。 - mmTmmR
在某一行中出现了“回车符 ^M”:如果^M是行终止符,那不是我所期望的结果。预期将是提前结束该行。由于您有3个字段,有问题的行可能是value-for-urn,value-for-forename。由于第三个字段缺失,拷贝操作将推断第二个字段继续到下一行,这在CSV规则中是合法的,但仅当该字段用双引号括起来时才有效。 - Daniel Vérité
4个回答

9

在MAC-El Capitan中,我发现解决这个问题最简单的方法是:

1)使用Sublime Text打开文件
2)在菜单中选择以UTF8编码重新打开文件
3)在菜单中以UTF8编码保存文件

Sublime会将所有行尾EOF进行“规范化”。


非常感谢!这让我在紧急期限内免去了很多烦恼。 - allardbrain
啊,但是如果你的进程已经默认使用Python中Pandas库的df.to_csv()方法并采用UTF8编码呢? - user12217470

0

这可能是由于 Windows 的换行符引起的。尝试安装实用程序 dos2unix 并在执行 COPY 命令之前运行 dos2unix <filename>


0
在我的情况下,我注意到 CSV 文件末尾有一个额外的空格。删除它后,文件成功导入了。

-1

我创建了一个单独的文件夹,并给予“所有人”读写权限,这解决了所有问题,包括通过pgAdmin4导入文件时出现的访问被拒绝的问题。似乎是“万能药”。

现在,只需要找出我需要授予这些权限而不是“所有人”的用户。

在Windows 10上使用PostgreSQL v 9.6。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接