2013-05-17 51 views
9

我想導入(相當大).txt文件到PostgreSQL 9.1中的表geonames。我在我的服務器的目錄下,並在該目錄中放置一個名爲US.txt的文件。我設置了search_path變量geochat,我正在使用的數據庫的名稱,然後我進入這個查詢:Postgres從csv文件複製 - 沒有這樣的文件或目錄

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或類似的第一,或者它應該從目前的工作目錄?

回答

9

一對夫婦的誤解:

I'm in the /~ directory of my server

沒有目錄/~。它可以是/(根目錄)或~(當前用戶的主目錄)。這也與問題無關。

2.

I set the search_path variable to geochat, the name of the database I'm working in

search_path無關與數據庫的名稱。它適用於當前數據庫內的模式。你可能需要重置這個。


您需要使用絕對路徑爲您的文件。作爲記錄in the manual here

filename

The absolute path name of the input or output file.

4.
分隔符:只有噪音。

The default is a tab character in text format

5.
NULL:這是相當罕見的使用實際的字符串'NULL'NULL值。你確定?

The default is \N (backslash-N) in text format, and an unquoted empty string in CSV format.

我的猜測(後復位search_path - 或者你架構限定表名):有點晚

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

你點3.連接手動實際上指出,一個相對路徑是確定的輸入文件:'輸入文件名可以是絕對路徑或相對路徑http://www.postgresql.org/docs/current/interactive/sql-copy.html儘管它似乎不適用於相對路徑。 – Risadinha

2

路徑相對於PostgreSQL服務器而不是psql客戶端。

假設您正在運行PostgreSQL 9.4,您可以將US.txt放在目錄/var/lib/postgresql/9.4/main/中。

1

如果您從腳本運行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 
相關問題