Я бы рекомендовал отказаться от temp_table
. Не имеет особого смысла иметь необработанный текст CSV в Postgres.
Если ваши CSV-файлы имеют фиксированный набор полей, создайте таблицу со всеми теми же столбцами, что и CSV. Затем используйте copy
для импорта CSV.
COPY your_table(your, columns)
FROM '/your/csv/file.csv' DELIMITER ',' CSV HEADER;
Путь на сервере . Если ваша база данных не является локальной, вам придется скопировать из STDIN или использовать /copy
из psql. Большинство интерфейсов баз данных Postgres предоставляют метод copy
, упрощающий копирование локального файла.
Если в ваших файлах CSV нет фиксированного набора полей и вам нужно JSON, то нет выгода делать это в Postgres. Проще выполнить обработку на любимом языке программирования. Проанализируйте файл CSV, превратите поля в объект JSON, затем вставьте готовый продукт.
Несмотря на намек на природу ваших данных, было бы легче работать, если бы вы создали более традиционный набор столиков для его хранения. Например, вместо percent_green_cover_august
создайте таблицу для хранения атрибутов для временного диапазона .
create table attributes_by_period (
whatever_this_is_part_of_id bigint not null references whatever_this_is_part_of(id),
period tzrange not null,
percent_green_cover integer check(0 <= percent && percent <= 100)
);
-- Thing 42 had 15% green coverage in August.
-- [ is inclusive, ) is exclusive
insert into attributes_by_period
(whatever_this_is_part_of_id, period, percent_green_cover)
values( 42, '[2019-08-01 00:00, 2019-09-01 00:00)', 15 )
Когда вы создаете JSON, не создавайте его рукой. Используйте функции JSON и операторы , например jsonb_build_object
. Это проще, и он выполнит все цитирование и экранирование за вас.
jsonb_build_object(
'percent_green_cover_august', substring(data, 61, 2),
'percent_green_cover_september' : substring(data, 63, 2)
)
Увидимся, космический ковбой.