Импортировать CSV, содержащий комплекс JSON, в Postgres - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть CSV-файл, один из столбцов которого, json_dic, содержит сложный JSON со множеством вложенных полей в списках в словарях и т. Д.

Как лучше всего загрузить этот файл вБаза данных Postgres, чтобы я мог обращаться к определенным полям и искать их и получать эти данные из SQL-запроса?

Например, у меня есть миллионы строк следующего содержания:

enter image description here

Столбец JSON json_doc выглядит следующим образом, но он не соответствует другим строкам, т. Е. Есть другие вложенные словари в разных местах и ​​т. Д .:

{"id": "0436d9b9305d", "base": {"ateco": [{"code": "46.11.03", "rootCode": "G", "description": "Agenti e rappresentanti di animali vivi"}], "founded": "1972-07-10", "legalName": "COBEM - S.R.L.", "legalForms": [{"name": "Società Di Capitale", "level": 1}, {"name": "Società A Responsabilità Limitata", "level": 2}]}, "name": "COBEM - S.R.L.", "people": {"items": [{"name": "45808b0b5b5affa871c8e91169bb10c6930fac56", "givenName": "64e4393f477394f11f6477ca76395ed469548865", "familyName": "68ee44f14dc54d664dffe63195d42a14988b69bb"}]}, "country": "it", "locations": {}}

Как я могу загрузить это, либо вэто текущая форма CSV или в формате JSON для PostgreSQL?Я искал ответ в течение нескольких дней, но ничего не получил.Я пытался использовать COPY, использовать pandas, json_normalize и т. Д. Я хочу иметь возможность выполнить объединение, чтобы сопоставить, например, идентификационные номера с другой таблицей, а затем извлечь информацию из этого сложного файла.Это вообще возможно?

Одна из моих попыток:

import csv
import json 

csvfile = open('sample.csv', 'r')
jsonfile = open('data.json', 'w')
reader = csv.DictReader(csvfile)
i = 0
for row in reader:
    if i < 3:
        json.dump(row, jsonfile)
        i+=1
    else:
        break

А потом в моем терминале psql:

SN_ITA_test=# \COPY public."ITA_test" FROM 'data.json';

Выход:

  ERROR:  extra data after last expected column
CONTEXT:  COPY ITA_test, line 1: "{"id": "4002736", "json_doc": "{\"id\": \"0436d9b9305d\", \"base\": {\"ateco\": [{\"code\": \"46.11...."

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Поскольку у вас огромный CSV-файл и ваши требования кажутся нетривиальными, я бы предложил использовать программу csv2json на https://github.com/fadado/CSV в сочетании с .Вы бы использовали jq для обработки каждой строки, созданной csv2json отдельно.

Если вы не хотите обрабатывать каждую CSV-запись отдельно (т. Е. Без преобразования всего CSV-файла), вы можете рассмотреть толькоРешение jq, с использованием синтаксического анализатора CSV в jq, например https://gist.github.com/pkoppstein/bbbbdf7489c8c515680beb1c75fa59f2

0 голосов
/ 06 декабря 2018

Если ваши данные в формате CSV, вам нужно будет указать COPY:

\copy public."ITA_test" FROM 'data.json' (FORMAT 'csv')

Формат по умолчанию - text, где поля разделены символами табуляции.

Если, с другой стороны, одна строка файла - это просто один большой JSON, вы бы загрузили его примерно так:

CREATE TABLE jsons (
   id serial PRIMARY KEY,
   j jsonb NOT NULL
);

\copy jsons (j) FROM 'data.json'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...