2013-05-17 21 views
9

Próbuję zaimportować (raczej duży) plik .txt do tabeli geonames w PostgreSQL 9.1. Znajduję się w katalogu/~ na moim serwerze, z plikiem o nazwie US.txt umieszczonym w tym katalogu. I ustawić zmienną search_path do geochat, nazwę bazy danych pracuję w I następnie wprowadzić tę kwerendę.Postgres KOPIUJ Z pliku csv - Brak takiego pliku lub katalogu

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

I wtedy pojawia się ten błąd:

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

mam wpisać w \i US.txt lub coś podobnego w pierwszej kolejności, czy też powinno to być po prostu z obecnego katalogu roboczego?

Odpowiedz

9

Kilka nieporozumień:

1.

I'm in the /~ directory of my server

Nie ma katalogu /~. Jest to / (katalog główny) lub ~ (katalog domowy bieżącego użytkownika). Jest to również nieistotne dla problemu.

2.

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

search_path nie ma nic wspólnego z nazwą bazy danych. To jest dla schemas wewnątrz bieżącej bazy danych. Prawdopodobnie musisz to zresetować.

3.
Jesteś zobowiązany do korzystania z bezwzględną ścieżkę do pliku. Jak udokumentowano in the manual here:

filename

The absolute path name of the input or output file.

4.
DELIMITER: tylko szum.

The default is a tab character in text format

5.
NULL: To jest raczej rzadkością, aby korzystać z rzeczywistej ciąg 'NULL' dla wartości NULL. Jesteś pewny?

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

Domyślam (po zresetowaniu search_path - albo schematu określić nazwę tabeli):

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

Instrukcja jesteś połączony do punktu 3. rzeczywiście stwierdza, że ​​względna ścieżka jest ok dla plików wejściowych: 'nazwę pliku wejściowego może być absolutną lub względną ścieżką "http://www.postgresql.org/docs/current/interactive/sql-copy.html Chociaż naprawdę nie działa ze względnymi ścieżkami. – Risadinha

2

Ścieżki odnoszą się do serwera PostgreSQL, a nie do klienta psql.

Zakładając, że korzystasz z PostgreSQL 9.4, możesz umieścić US.txt w katalogu /var/lib/postgresql/9.4/main/.

1

jeśli używasz polecenia COPY ze skryptu, możesz wykonać krok w skrypcie, który tworzy polecenie COPY z poprawną ścieżką bezwzględną.

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

można następnie uruchomić ten fragment do pliku i wykonać go

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