Скопируйте несколько столбцов csv файла в таблицу
У меня есть файл CSV с 10 столбцами. После создания таблицы PostgreSQL с 4 столбцами я хочу скопировать в таблицу несколько из 10 столбцов.
столбцы моей таблицы CSV похожи на:
x1 x2 x3 x4 x5 x6 x7 x8 x9 x10
столбцы моей таблицы PostgreSQL должны выглядеть следующим образом:
x2 x5 x7 x10
Ответы
Ответ 1
Если это специальная задача
Создайте временную таблицу со всеми столбцами входного файла
create temporary table t (x1 integer, ... , x10 text)
Скопировать из файла в него:
copy t (x1, ... , x10)
from '/path/to/my_file'
with (format csv)
Теперь вставьте окончательную таблицу из temp:
insert into my_table (x2, x5, x7, x10)
select x2, x5, x7, x10
from t
И отбросьте его:
drop table t
Если это частая задача
Используйте расширение file_fdw
. В качестве суперпользователя:
create extension file_fdw;
create server my_csv foreign data wrapper file_fdw;
create foreign table my_csv (
x1 integer,
x2 text,
x3 text
) server my_csv
options (filename '/tmp/my_csv.csv', format 'csv' )
;
Предоставьте разрешение выбора в таблице пользователю, который его прочитает:
grant select on table my_csv to the_read_user;
Затем при необходимости читайте непосредственно из файла csv, как если бы это была таблица:
insert into my_table (x2)
select x2
from my_csv
where x1 = 2
Ответ 2
Вы можете указать столбцы, которые хотите заполнить командой COPY
. Например:
\copy your_table (x2,x5,x7,x10) FROM '/path/to/your-file.csv' DELIMITER ',' CSV;
Здесь doc для команды COPY
.
Ответ 3
Только что прибыл сюда, чтобы преследовать решение только загрузить подмножество столбцов, но, по-видимому, это невозможно. Итак, используйте awk (или cut
), чтобы извлечь нужные столбцы в новый файл new_file
:
$ awk '{print $2, $5, $7, $10}' file > new_file
и загрузите new_file
. Вы можете напрямую выводить вывод на psql
:
$ cut -d \ -f 2,5,7,10 file |
psql -h host -U user -c "\COPY table(col1,col2,col3,col4) FROM STDIN DELIMITER ' '" database
Ответ 4
Чтобы загрузить данные из электронной таблицы (Excel или OpenOffice Calc) в postgreSQL:
Сохраните страницу электронной таблицы как файл CSV. Предпочтительным методом является открытие таблицы на OpenOffice Calc и сохранение. В окне "Экспорт в текстовый файл" выберите "Набор символов в виде Юникода" (UTF8), разделитель полей: "," и "Разделитель текста" ". Появится сообщение с сообщением о сохранении только активного листа. Примечание: Этот файл должен быть сохранен на папка, но не на рабочем столе и должна сохранять в формате UTF8 (postgreSQL by dafault повышает скорость кодирования UTF8). При сохранении на рабочем столе postgreSQL будет выдавать сообщение" отказ в доступе" и не будет загружаться.
В PostgreSQL создайте пустую таблицу с таким же числом столбцов, что и таблица.
Примечание. В каждом столбце имя столбца должно быть одинаковым, тип данных должен быть одинаковым. Кроме того, имейте в виду длину данных, где символ изменяется с достаточным полем.
Затем на postgreSQL в окне SQL поместите код:
скопируйте "ABC" . "def" из E'C:\\tmp\\blabla.csv 'разделители', 'CSV HEADER;
ПРИМЕЧАНИЕ. Здесь C:\\tmp - это папка, в которой сохраняется CSV файл "blabla". "ABC" . "Def" - это таблица, созданная на postgreSQL, где "ABC" - это схема, а "def" - фактическая таблица. Затем выполните "выполнить запрос", нажав зеленую кнопку сверху. "CSV HEADER" необходим, когда таблица CSV имеет заголовок в начале каждого столбца.
Если каждый из них в порядке, сообщение об ошибке не будет отображаться, и данные таблицы из файла CSV будут загружены в таблицу postgreSQL. Но если есть сообщение об ошибке, выполните следующие действия:
Если в сообщении об ошибке указано, что данные слишком длинны для определенного столбца, а затем увеличьте размер столбца. Это происходит в основном на колонке символов и символов. Затем снова запустите команду "выполнить запрос".
Если в сообщении об ошибке указано, что тип данных не соответствует определенному столбцу, затем измените тип данных в столбце таблицы postgreSQL, чтобы он соответствовал таковому в таблице CSV.
В вашем случае после создания CSV файла удалите ненужные столбцы и сопоставьте столбцы в таблице postgre.
Ответ 5
Вы могли бы принять предложение Джеймса Брауна дальше и делать все в одной строке:
cat file | awk -F ',' '{print $2 "," $5 "," $7 "," $10}' | psql -d db -c "\ copy MyTable из заголовка CSD STDIN