24

我运行这个命令:

COPY XXX FROM 'D:/XXX.csv'  WITH (FORMAT CSV, HEADER TRUE, NULL 'NULL')

在 Windows 7 中,它成功导入小于 1GB 的 CSV 文件。

如果文件大于 1GB,我会收到“未知错误”。

[Code: 0, SQL State: XX000]  ERROR: could not stat file "'D:/XXX.csv'  Unknown error

我该如何解决这个问题?

4

8 回答 8

25

您可以通过程序通过管道传输文件来解决此问题。例如,我刚刚使用它从 Windows 10 和 PostgreSQL 11 上的 24GB 文件中复制。

copy t(c,d) from program 'cmd /c "type x:\path\to\file.txt"' with (format text);

这会将文本文件复制file.txt到表t、列cd.

这里的技巧是cmd在单个命令模式下运行,/c并告诉它type输出有问题的文件。

于 2019-08-18T12:08:47.157 回答
13

https://github.com/MIT-LCP/mimic-code/issues/493 alistairewj 于 2018 年 11 月 3 日发表评论 • ► 已编辑

好的,无法统计文件“CHARTEVENTS.csv”:未知错误实际上是 PostgreSQL 11 中的一个错误。在后台它调用 fstat() 以确保文件不是目录,不幸的是 fstat() 是一个 32 位程序,不能处理大文件,如 chartevents。我使用 PostgreSQL 10.5 在 Windows 上测试了构建,我没有收到这个错误,所以我认为它是相当新的。

最好的解决方法是保持文件压缩(即,将它们保存为 .csv.gz 文件)并使用 7zip 直接从压缩文件中加载数据。在测试中,这似乎仍然有效。这里有一个关于如何做到这一点的非常详细的教程:https ://mimic.physionet.org/tutorials/install-mimic-locally-windows/

上面的简短版本是您保留 .csv.gz 文件,将 7zip 二进制文件添加到 Windows 环境路径,然后调用 postgres_load_data_7zip.sql 文件以加载数据。您可以在完成所有操作后使用 postgres_checks.sql 文件,以确保您正确加载了所有数据。

编辑:对于您以后使用此 7zip 方法的错误,我不确定为什么它没有加载。尝试仅重新下载 ADMISSIONS.csv.gz 文件,看看它是否仍然会引发同样的错误。也许有一个新版本的 7zip 需要我更新脚本之类的!

于 2018-11-29T07:08:40.130 回答
8

对于尝试在 Postgres 11 中处理 >1gb 文件后在 Google 上搜索此 Postgres 错误消息的其他人,我可以确认@亚军吴的上述回答是正确的。确实是大小问题。

不过,我尝试了与@亚军吴和@Loren 不同的方法:我只是卸载了 Postgres 11 并安装了 Postgres 10.7 的稳定版本。(顺便说一句,我在 Windows 10 上,以防万一。)

我重新运行了提示错误的原始代码,瞧,几分钟后,我用中等大小的 csv 文件(~3gb)中的数据填写了一个新表。我最初尝试使用@Loren 的 CSVSplitter,它运行良好,直到我的机器上的存储空间快用完。(谢谢,战地 5。)

就我而言,我所依赖的 PGSQL 11 中没有任何东西不在 10.7 版中,所以我认为这对于遇到此问题的其他人来说可能是一个很好的解决方案。感谢上面的每个人的贡献,特别是首先发布这个的 OP。我治好了一个巨大的、巨大的头痛!

于 2019-04-11T22:16:48.527 回答
5

这已在 PostgreSQL v14的 commit bed90759f中修复。

错误的文件限制实际上是 4 GB。

该修复程序侵入性太大,无法向后移植,因此您只能升级以避免该问题。一旦修复经过一些现场测试,您可以游说 pgsql-hackers 邮件列表以将其反向移植。

于 2021-03-08T07:42:08.663 回答
3

使用 pgAdmin 和 AWS,我使用 CSVSplitter 将文件拆分为小于 1GB 的文件。蹩脚,但工作。pgAdmin import 追加到现有表。(将转义字符从 ' 更改为 " 以避免由于源文件中的未引用文本而导致错误。通常我在 LibreOffice 中应用引号,但这些文件太大而无法打开。)

于 2018-12-16T16:23:40.310 回答
3

看来这不是数据库问题,而是psql/pgadmin的问题。解决方法是使用以前 psql 版本的管理软件:

  1. 使用现有的 PostgreSQL 11 数据库
  2. 从 PostgreSQL 10 安装中安装 psql 或 pgadmin 并使用它来上传文件(使用问题中显示的命令)

希望这可以帮助遇到同样问题的任何人。

于 2020-02-20T14:26:38.593 回答
0

在您的 CSV 文件中添加两行:一行在开头,一行在结尾:

从标准输入复制 XXX(格式 CSV,标题 TRUE,NULL 'NULL');
<这里是您的文件已经包含的行>
\.

不要忘记 \ 之后的另一个换行符。线。然后调用
psql -h hostname -d dbname -U username -f 'D:/XXX.csv'

于 2021-10-02T15:14:34.973 回答
0

这对我有用: \COPY member_data.lab_result FROM PROGRAM 'gzip -dcf lab_result.dat.gz' WITH (FORMAT 'csv', DELIMITER '|', QUOTE '`')

于 2021-12-30T04:57:30.000 回答