错误:在 psql 中使用 \copy 时缺少列数据

Posted

技术标签:

【中文标题】错误:在 psql 中使用 \\copy 时缺少列数据【英文标题】:ERROR: missing data for column when using \copy in psql错误:在 psql 中使用 \copy 时缺少列数据 【发布时间】:2015-01-01 02:05:23 【问题描述】:

我正在尝试将 .txt 文件导入 PostgreSQL。 txt文件有6列:

Laboratory_Name Laboratory_ID   Facility    ZIP_Code     City   State

还有 213 行。

我正在尝试使用 \copy 将此文件的内容放入 PostgreSQL 中名为 doe2 的表中,使用此命令:

\copy DOE2 FROM '/users/nathangroom/desktop/DOE_inventory5.txt' (DELIMITER(' '))

它给了我这个错误:

missing data for column "facility"

我已经四处寻找遇到此错误时该怎么做,但没有任何帮助。有没有其他人遇到过这种情况?

【问题讨论】:

文件中的数据是什么样的? (几行样本。) 【参考方案1】:

三种可能的原因:

    文件的一行或多行只有 4 个或更少的空格字符(您的分隔符)。

    一个或多个空格字符被转义(无意)。也许在未引用值的末尾带有反斜杠。对于您使用的(默认)text 格式,the manual explains:

    可以在COPY数据中使用反斜杠字符(\)来引用数据 否则可能被视为行或列分隔符的字符。

从具有匹配布局的表中读取时,COPY TOpg_dump 的输出不会出现任何这些错误。但也许您的文件已被编辑或来自不同的错误来源?

    您没有使用您认为正在使用的文件。 psql 命令行界面的\copy 元命令是COPY 的包装器,用于读取客户端 的本地文件。如果您的文件位于服务器上,请改用 SQL 命令COPY

【讨论】:

我不认为这是第一个,因为我将分隔符更改为“,”并且发生了同样的事情。我不认为这是第二个,因为我的整个文件中没有一个反斜杠(我用 ctrl-F 进行了搜索)。如果是第三个,我不知道如何解决它。我在 pgadmin GUI 中尝试 COPY 命令,我收到此错误:错误:无法打开文件“/users/nathangroom/desktop/DOE_inventory5.txt”进行阅读:权限被拒绝。我在 *** 的其他地方看到,在命令 shell 中使用 \copy 命令是该错误的解决方案。 @nathanmgroom:你的文件在哪里? Postgres 服务器在哪里?你的客户在哪里?此外,您不能随意更改分隔符。它必须是您的文件中使用的那个。它是哪一个?默认为文本格式的制表符。 文件在我的桌面上,我不知道 postgres 服务器和客户端的确切位置,但我知道它都是本地的,在我的机器上。服务器说它是 localhost 5432。我将其保存为 csv 后再次尝试,我收到此错误:错误:整数的无效输入语法:“Laboratory_ID”这没有意义,因为该列中肯定有一个整数。 @nathanmgroom: 最后一个错误表明您在标题行中包含了每列的名称,这在 csv 模式下使用 HEADER 选项是允许的,但在(默认)文本模式下是不允许的。删除该行并重试。此外,如果一切都在本地运行,您可以使用 \copyCOPY - 两者都访问同一个文件系统。但是COPY 对权限的限制更大。 这个答案对我有用。我有同样的错误,发现提示是point 1。我的.csv 中的一个数据字段包含一个逗号,因为我使用的工具转换错误。使用更好的工具将数据重新转换为 csv 解决了这个问题。谢谢!【参考方案2】:

仔细检查文件。就我而言,文件末尾的空白行导致了ERROR: missing data for column。删除它,并且工作正常。

Printing the blank lines 可能会透露一些有趣的事情:

cat -e $filename

【讨论】:

以上是关于错误:在 psql 中使用 \copy 时缺少列数据的主要内容,如果未能解决你的问题,请参考以下文章

psql备份csv文件

PSQL /copy : 变量替换不起作用 | PostgreSQL 11

RedShift Copy - 列数不匹配 - 可以在卸载中指定吗?

使用 psql 时获取错误代码

Redshift COPY 无法从 S3 读取 tar.gz。错误代码 1216。缺少换行符:在位置 1 发现意外字符 0x2f

1214:使用 COPY 命令将数据从 csv 导入 Redshift 时 CSV 的报价格式无效