将包含复杂JSON的CSV导入Postgres

时间:2018-12-06 05:57:03

标签: python json postgresql csv

我有一个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等。我希望能够进行联接以将ID号与另一个表进行匹配,然后从该复杂文件中提取信息。这有可能吗?

我的尝试之一:

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 :(得分:0)

如果数据为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'

答案 1 :(得分:0)

由于您有一个庞大的CSV文件,并且由于您的要求似乎不平凡,所以我建议结合https://github.com/fadado/CSV使用处的csv2json程序。您将使用jq分别处理csv2json产生的每一行。

如果您不想单独处理每个CSV记录(即不转换整个CSV文件),则不妨考虑使用jq中的CSV解析器,例如,仅jq解决方案。 https://gist.github.com/pkoppstein/bbbbdf7489c8c515680beb1c75fa59f2