2015-11-04 3 views
0

Я создаю базу данных и таблицу PostgreSQL, и я хочу импортировать данные в базу данных с текстовым файлом.PostgreSQL импортировать текстовый файл

Пример моих данных:

jameson aa 
david bb 
piter cc 
mat dd 
rob ee 

Это Баш может импортировать файлы, но очень медленно для длинных файлов:

#!/bin/sh 
sed 's/ /\',\'/g' file > My_file 
while read line; do 
psql -d My_db -c "insert into My_table values('$line')" 
done < My_file 

также я прочитал эту решительность, но этот импорт только FIRSTLINE в первом поле & не использовать разделитель

testdb=> \set content '''' `cat my_file.txt` '''' 
testdb=> INSERT INTO my_table VALUES (:content); 

ответ

0

\copy c ommand. Эта команда предназначена для импорта данных из файлов.

\copy my_table from my_file.txt DELIMITER ' ' 

Это просто, но Postgres довольно строг - он не требует пустой строки в конце и ровно один пробела между полями.

Примечание: ваши данные несовместимы - первая строка содержит пробел между полями.

Обратно к вашему примеру. Это должно быть медленно. Вы импортируете в одну строку - для каждой строки вы начинаете psql и там транзакция. Использование опции pipe и single transaction должно быть намного быстрее. С awk вы можете генерировать SQL скрипт:

cat my_file.txt | \ 
awk -F" " -v Q="'" '{print "INSERT INTO my_table VALUES(" Q$1Q " , " Q$2Q ");" }' | \ 
psql postgres -1 

Но есть риск возможного недостающего сбежавшего апострофа в данных (он же безопасное, как ваш медленным раствор). COPY решение должно быть намного лучше и на 100% безопасно. Он обеспечивает все необходимое для выхода изнутри.

testdb=> \set content '''' `cat my_file.txt` '''' 
testdb=> INSERT INTO my_table VALUES (:content); 

Это не должно работать. Операторы SQL в psql не поддерживают массовые операции над массивом (например, ODBC). Результатом вашего примера является некорректная команда INSERT. Переменные сеанса оцениваются как замена строк. Вы отправляете заявление на сервер, например:

INSERT INTO my_table VALUES ('Jameson','aa', 
'david','bb', 
'pitter','cc' 
...) 

И это неверно.

+0

My_file не имеет пустой строки и был устроен точно так же, как и образец редактирование пространства в разрезе К сожалению, я мог бы использовать ваш код Это немного больше объяснений? – David

+0

Tnx pavel, Ваше руководство было большой помощью. – David