Python 将包含复杂JSON的CSV导入Postgres
我有一个CSV文件,其中一列,Python 将包含复杂JSON的CSV导入Postgres,python,json,postgresql,csv,jq,Python,Json,Postgresql,Csv,Jq,我有一个CSV文件,其中一列,json\u dic,包含复杂的json,字典中的列表中有许多嵌套字段等 将此文件上载到Postgres数据库以便访问/搜索特定字段并从SQL查询中检索数据的最佳方式是什么 例如,我有数百万行以下内容: JSON列JSON\u doc如下所示,但对于其他行,它不一致,即在不同的位置有其他嵌套字典等: {"id": "0436d9b9305d", "base": {"ateco": [{"code": "46.11.03", "rootCode": "G", "de
json\u dic
,包含复杂的json,字典中的列表中有许多嵌套字段等
将此文件上载到Postgres数据库以便访问/搜索特定字段并从SQL查询中检索数据的最佳方式是什么
例如,我有数百万行以下内容:
JSON列JSON\u 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\u 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
收益率:
ERROR: extra data after last expected column
CONTEXT: COPY ITA_test, line 1: "{"id": "4002736", "json_doc": "{\"id\": \"0436d9b9305d\", \"base\": {\"ateco\": [{\"code\": \"46.11...."
如果您的数据是CSV格式,您必须告诉
复制
:
\copy public."ITA_test" FROM 'data.json' (FORMAT 'csv')
默认格式为文本
,其中字段由制表符分隔
另一方面,如果文件的一行只是一个大的JSON,则加载方式与此类似:
CREATE TABLE jsons (
id serial PRIMARY KEY,
j jsonb NOT NULL
);
\copy jsons (j) FROM 'data.json'
由于您有一个巨大的CSV文件,而且您的需求似乎并不琐碎,因此我建议将csv2json程序与结合使用。您可以使用jq分别处理csv2json生成的每一行
如果您不想单独处理每个CSV记录(即,不转换整个CSV文件),您可能希望只考虑JQ解决方案,使用JQ中的CSV解析器WITTEN,例如
您有什么要求?您可以将文件作为一个整体读取并将其放入单个BLOB中,但这可能不是您想要的。顺便说一句:我首先要做的一件事是修正元格式,使其不是CSV中JSON的混合体,而只是其中的一种。谢谢@UlrichEckhardt-我已经将JSON_doc列隔离到一个单独的CSV中。我这样做是通过进入Mac号码,删除不相关的列并导出到csv。我希望能够基于ID与另一个文件进行连接,并从该文件中提取各种字段,如法定名称、地址等。但我有点担心,因为json_doc列的格式没有太多一致性。谢谢Laurenz-我得到错误:json DETAIL类型的无效输入语法:Token“ID”无效。上下文:JSON数据,第1行:{“JSON_doc”:“{”id…复制jsons,第1行,第j列:“{”JSON_doc”:“{”id:“0436d9b9305d”,“base:{”ateco:[{”code:“46.11.03”,“rootCode:“G”,“descr…”要理解这个错误,我必须要有一个精确的副本,如果是那个文件的话。其中一定有一些奇怪之处,因为上面显示的JSON很好。CREATE TABLE jsons (
id serial PRIMARY KEY,
j jsonb NOT NULL
);
\copy jsons (j) FROM 'data.json'