Как вставить со значениями подстроки в столбец json в PostgreSQL? - PullRequest
0 голосов
/ 25 мая 2020

У меня есть много CSV с необработанными данными, которые я хочу поместить в одну главную таблицу. Я импортировал все CSV как временные таблицы. Затем я должен использовать подстроки, чтобы вытащить специфику c, соответствующую информацию из временных таблиц. Это работает со столбцом состояния (varchar), когда значение равно atomi c.

Как я могу сделать это для столбца attribute_list (json), если значение не является atomi c и я не могу использовать строковые литералы?

INSERT INTO master_table (data_file_name, state, attribute_list) 

SELECT
'example_name', substring(data, 1, 2),
'{"percent_green_cover_august" : substring(data, 61, 2), 
"percent_green_cover_september" : substring(data, 63, 2)}'

FROM temp_table; 

EDIT: проблема в том, что есть около 200 временных таблиц, которые я загрузил из CSV. Все они разные. Они содержат одно поле, данные (varchar), то есть серию пробелов и чисел, например:

11 1134 4446 48685 989
15 4 4 4 78 90 09 
01932938     838490 111
11 1

У меня есть файл Excel, содержащий строки, представляющие каждый CSV, а заголовки столбцов соответствуют значениям представлять. Затем я использую Python для создания вставки в операторы. Первоначально каждый заголовок столбца был бы отдельным полем в базе данных, но это привело бы к созданию более 2000 уникальных столбцов.

1 Ответ

0 голосов
/ 25 мая 2020

Я бы рекомендовал отказаться от 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)
)

Увидимся, космический ковбой.

...