Подтвердить что ты не робот

Скопируйте несколько столбцов csv файла в таблицу

У меня есть файл CSV с 10 столбцами. После создания таблицы PostgreSQL с 4 столбцами я хочу скопировать в таблицу несколько из 10 столбцов.

столбцы моей таблицы CSV похожи на:

x1 x2 x3 x4 x5 x6 x7 x8 x9 x10

столбцы моей таблицы PostgreSQL должны выглядеть следующим образом:

x2 x5 x7 x10
4b9b3361

Ответ 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