Добавить & ldquo; Автоматический прирост Первичный ключ & rdquo; столбец в Postgresql при импорте файла TXT [дубликат]

Вот в C ++ 11, используя std::initializer_list:

#include <algorithm>
#include <initializer_list>

template <typename T>
bool is_in(const T& v, std::initializer_list<T> lst)
{
    return std::find(std::begin(lst), std::end(lst), v) != std::end(lst);
}

с этим, вы можете сделать:

if (is_in(num, {1, 2, 3})) { DO STUFF }
35
задан Clodoaldo Neto 16 February 2016 в 17:00
поделиться

6 ответов

Как указывали другие ответы, было возможно указать столбцы для копирования в таблицу PG. Однако, без возможности ссылки на имена столбцов в CSV, это имело небольшую полезность, кроме загрузки в таблицу, где столбцы имели другой порядок.

К счастью, начиная с Postgres 9.3, можно копировать столбцы не только из файла или стандартного ввода, но также из команды оболочки с помощью PROGRAM:

PROGRAM

Команда для выполнения. В COPY FROM вход считывается из стандартного вывода команды, а в COPY TO вывод записывается на стандартный ввод команды.

Обратите внимание, что команда вызывается оболочкой, поэтому если вам нужно передать какие-либо аргументы команде оболочки, которая поступает из ненадежного источника, вы должны быть осторожны, чтобы удалить или исключить любые специальные символы, которые могут иметь особое значение для оболочки. По соображениям безопасности лучше всего использовать фиксированную командную строку или, по крайней мере, не пропускать в нее какой-либо пользовательский ввод.

Это был недостающий элемент, который нам нужен для такой долгожданной функции , Например, мы могли бы использовать эту опцию в сочетании с cut (в системе на базе UNIX) для выбора определенных столбцов по порядку:

COPY my_table (x2, x5, x7, x10) FROM PROGRAM 'cut -d "," -f 2,5,7,10 /path/to/file.csv' WITH (FORMAT CSV, HEADER)

Однако cut имеет несколько ограничений при манипулировании CSV: он не может адекватно манипулировать строками с запятыми (или другими разделителями) внутри них и не позволяет выбирать столбцы по имени.

Существует несколько других команд с открытым исходным кодом, которые лучше манипулируют CSV-файлами, такими как csvkit или miller. Вот пример использования miller для выбора столбцов по имени:

COPY my_table (x2, x5, x7, x10) FROM PROGRAM 'mlr --csv lf cut -f x2,x5,x7,x10 /path/to/file.csv' WITH (FORMAT CSV, HEADER)

1
ответ дан arredond 18 August 2018 в 06:21
поделиться
  • 1
    Как отсутствие PROGRAM помешало вам использовать csvkit или Miller для выбора поднабора столбцов из исходного CSV-файла, записать их в новый CSV-файл и затем импортировать только те столбцы в таблицу, используя \copy? – Derek Mahar 24 April 2018 в 20:30
  • 2
    @DerekMahar, что позволяет PROGRAM, - это выполнять операции импорта, которые включают в себя управление исходным CSV программно, т. Е. Все внутри Postgres. Это особенно полезно при использовании внутри функции для автоматизации процесса импорта. – arredond 26 April 2018 в 07:24

Вы можете принять предложение Джеймса Брауна дальше и сделать все в одной строке:

файл cat | awk -F ',' '{print $ 2 "," $ 5 "," $ 7 "," $ 10 } '| psql -d db -c "\ copy MyTable из заголовка CSV STDIN"

0
ответ дан Chris Lawton 18 August 2018 в 06:21
поделиться

Если это специальная задача

Создайте временную таблицу со всеми столбцами во входном файле

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
52
ответ дан Clodoaldo Neto 18 August 2018 в 06:21
поделиться
  • 1
    Разве нет более чистого пути? – pratnala 15 August 2013 в 07:44
  • 2
    @pratnala нет, нет – 1ac0 16 November 2014 в 20:38
  • 3
    Вау. Ошибка PostgresQL. Даже команда Import в pgadmin3 не позволяет вам просто указывать, какие столбцы CSV-файла вы хотите включить. Sheesh, это похоже на материал 1980-х годов. – Joe Strout 8 January 2015 в 17:17
  • 4
    В postgreSQL 9+ используйте это в запросе копирования COPY t (x1, ... , x10) FROM '/path/to/my_file' WITH CSV больше в Postgresql docs – juliocesar 21 October 2015 в 22:17
  • 5
    @JoeStrout: PgAdmin не Postgresql. Это один из клиентов Postgresql. Используйте другого клиента по вашему выбору. – Clodoaldo Neto 16 February 2016 в 12:23

Просто приехал сюда, чтобы преследовать решение только загрузить подмножество столбцов, но, по-видимому, это невозможно. Итак, используйте 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
ответ дан James Brown 18 August 2018 в 06:21
поделиться
  • 1
    cut также поддерживает диапазон, например cut -d ',' -f1-5,7,20 file Полезно, если у вас есть файл со многими столбцами – rags 1 November 2017 в 08:58
  • 2
    @rags True. Обычно я использую awk, поскольку он позволяет печатать столбцы в произвольном порядке. С psql это не имеет значения, поскольку вы можете изменить порядок столбцов таблицы в \COPY (-c "\COPY table(col4,col3,col2,col1)..."). – James Brown 1 November 2017 в 09:04

Вы можете указать столбцы, которые хотите заполнить командой COPY. Например:

\copy your_table (x2,x5,x7,x10) FROM '/path/to/your-file.csv' DELIMITER ',' CSV;

Вот команда doc для команды COPY.

21
ответ дан Julien 18 August 2018 в 06:21
поделиться
  • 1
    Тем не менее, вы не можете копировать меньше столбцов, чем в файле. С помощью этой команды вы скопируете первый столбец файла на x2, второй на x5 и т. Д., Если в файле имеется только 4 столбца. – Rémi Svahn 24 July 2015 в 09:20

Чтобы загрузить данные из электронной таблицы (Excel или OpenOffice Calc) в postgreSQL:

Сохраните страницу электронных таблиц как файл CSV. Предпочтительным методом является открытие таблицы на OpenOffice Calc и сохранение. В окне «Экспорт в текстовый файл» выберите «Набор символов в виде Юникода» (UTF8), разделитель полей: «,» и «Разделитель текста» «». Появится сообщение, в котором будет сохранен только активный лист. Примечание. Этот файл должен быть сохранен в папке, но не на рабочем столе и должен сохранять в формате UTF8 (postgreSQL by dafault повышает скорость кодирования UTF8). Если вы сохранили на рабочем столе, postgreSQL предоставит сообщение «отказ в доступе» и не будет загружаться.

В PostgreSQL создайте пустую таблицу с таким же числом столбцов, что и электронная таблица.

Примечание. : В каждом столбце имя столбца должно быть одинаковым, тип данных должен быть одинаковым. Кроме того, имейте в виду длину данных, где символ изменяется с достаточным полем.

Затем в postgreSQL в окне SQL поместите код:

скопируйте «ABC». «Def» из E'C: \\ tmp \\ blabla.csv 'delimiters', 'CSV HEADER;

ПРИМЕЧАНИЕ. Здесь C: \\ tmp - это папка, в которой сохраняется CSV-файл «blabla». «ABC». «Def» - ​​это таблица, созданная на postgreSQL, где «ABC» - это схема, а «def» - ​​фактическая таблица. Затем выполните «выполнить запрос», нажав зеленую кнопку сверху. «CSV HEADER» необходим, когда таблица CSV имеет заголовок в начале каждого столбца.

Если каждый из них в порядке, сообщение об ошибке не будет отображаться, а данные таблицы из файла CSV будут загружены в таблицу postgreSQL. Но если есть сообщение об ошибке, выполните следующие действия:

Если в сообщении об ошибке указано, что данные слишком длинны для определенного столбца, а затем увеличьте размер столбца. Это происходит в основном на колонке символов и символов. Затем снова запустите команду «выполнить запрос».

Если в сообщении об ошибке указано, что тип данных не соответствует определенному столбцу, затем измените тип данных в столбце таблицы postgreSQL, чтобы он соответствовал CSV.

В вашем случае после создания CSV-файла удалите ненужные столбцы и сопоставьте столбцы в таблице postgre.

0
ответ дан Sagun 18 August 2018 в 06:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: