Postgres COPY FROM csv file-没有这样的文件或目录

时间:2013-05-17 21:36:42

标签: postgresql csv import psql tsv

我正在尝试将一个(相当大的).txt文件导入PostgreSQL 9.1中的表格地名。我在我的服务器的/〜目录中,在该目录中放置了一个名为US.txt的文件。我将search_path变量设置为geochat,即我正在使用的数据库的名称。然后我输入此查询:

COPY geonames
FROM 'US.txt',
DELIMITER E'\t',
NULL 'NULL');

然后我收到此错误:

ERROR: could not open file "US.txt" for reading: No such file or directory.

我是否必须首先键入\i US.txt或类似内容,或者它应该从当前工作目录中获取它?

5 个答案:

答案 0 :(得分:16)

也许有点晚了,但希望有用:

使用\ copy而不是

https://wiki.postgresql.org/wiki/COPY

jvdw

答案 1 :(得分:13)

一些误解:

<强> 1

  

我在服务器的/〜目录中

没有目录/~。它是/(根目录)或~(当前用户的主目录)。这也与问题无关。

<强> 2

  

我将search_path变量设置为geochat,即我正在使用的数据库的名称

search_path与数据库名称无关。它适用于当前数据库中的 schemas 。你可能需要重置它。

第3
您需要为文件使用绝对路径。记录在案in the manual here

  

<强> filename

     

输入或输出文件的绝对路径名。

<强> 4
DELIMITER:只是噪音。

  

默认为文本格式的标签字符

<强> 5
NULL:对'NULL'值使用实际字符串NULL并不常见。你确定吗?

  

默认为文本格式的\N(反斜杠-N),以及CSV格式的不带引号的空字符串。

我的猜测(重置search_path后 - 或您对表名进行架构限定):

COPY geonames FROM '/path/to/file/US.txt';

答案 2 :(得分:3)

路径相对于PostgreSQL服务器,而不是psql客户端。

假设您正在运行PostgreSQL 9.4,您可以将US.txt放在目录/var/lib/postgresql/9.4/main/中。

答案 3 :(得分:2)

如果您正在从脚本运行COPY命令,则可以在脚本中创建一个步骤,使用正确的绝对路径创建COPY命令。

MYPWD=$(pwd)
echo "COPY geonames FROM '$MYPWD/US.txt', DELIMITER E'\t';"
MYPWD=

然后,您可以将此部分运行到文件中并执行它

./step_to_create_COPY_with_abs_path.sh >COPY_abs_path.sql
psql -f COPY_abs_path.sql -d your_db_name

答案 4 :(得分:1)

另一种选择是从stdin中将其引入管道:

cat US.txt | psql -c "copy geonames from STDIN WITH (FORMAT csv);"