错误:在 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 TO
或 pg_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
选项是允许的,但在(默认)文本模式下是不允许的。删除该行并重试。此外,如果一切都在本地运行,您可以使用 \copy
和 COPY
- 两者都访问同一个文件系统。但是COPY
对权限的限制更大。
这个答案对我有用。我有同样的错误,发现提示是point 1。我的.csv
中的一个数据字段包含一个逗号,因为我使用的工具转换错误。使用更好的工具将数据重新转换为 csv 解决了这个问题。谢谢!【参考方案2】:
仔细检查文件。就我而言,文件末尾的空白行导致了ERROR: missing data for column
。删除它,并且工作正常。
Printing the blank lines 可能会透露一些有趣的事情:
cat -e $filename
【讨论】:
以上是关于错误:在 psql 中使用 \copy 时缺少列数据的主要内容,如果未能解决你的问题,请参考以下文章
PSQL /copy : 变量替换不起作用 | PostgreSQL 11
RedShift Copy - 列数不匹配 - 可以在卸载中指定吗?
Redshift COPY 无法从 S3 读取 tar.gz。错误代码 1216。缺少换行符:在位置 1 发现意外字符 0x2f