Вот в 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 }
Как указывали другие ответы, было возможно указать столбцы для копирования в таблицу PG. Однако, без возможности ссылки на имена столбцов в CSV, это имело небольшую полезность, кроме загрузки в таблицу, где столбцы имели другой порядок.
К счастью, начиная с Postgres 9.3, можно копировать столбцы не только из файла или стандартного ввода, но также из команды оболочки с помощью PROGRAM:
PROGRAM
Команда для выполнения. В COPY FROM вход считывается из стандартного вывода команды, а в COPY TO вывод записывается на стандартный ввод команды.
Обратите внимание, что команда вызывается оболочкой, поэтому если вам нужно передать какие-либо аргументы команде оболочки, которая поступает из ненадежного источника, вы должны быть осторожны, чтобы удалить или исключить любые специальные символы, которые могут иметь особое значение для оболочки. По соображениям безопасности лучше всего использовать фиксированную командную строку или, по крайней мере, не пропускать в нее какой-либо пользовательский ввод.
blockquote>Это был недостающий элемент, который нам нужен для такой долгожданной функции , Например, мы могли бы использовать эту опцию в сочетании с
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)
Вы можете принять предложение Джеймса Брауна дальше и сделать все в одной строке:
файл cat | awk -F ',' '{print $ 2 "," $ 5 "," $ 7 "," $ 10 } '| psql -d db -c "\ copy MyTable из заголовка CSV STDIN"
Создайте временную таблицу со всеми столбцами во входном файле
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
COPY t (x1, ... , x10) FROM '/path/to/my_file' WITH CSV
больше в Postgresql docs
– juliocesar
21 October 2015 в 22:17
Просто приехал сюда, чтобы преследовать решение только загрузить подмножество столбцов, но, по-видимому, это невозможно. Итак, используйте 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
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
.
Чтобы загрузить данные из электронной таблицы (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.
PROGRAM
помешало вам использовать csvkit или Miller для выбора поднабора столбцов из исходного CSV-файла, записать их в новый CSV-файл и затем импортировать только те столбцы в таблицу, используя\copy
? – Derek Mahar 24 April 2018 в 20:30