Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将包含复杂JSON的CSV导入Postgres_Python_Json_Postgresql_Csv_Jq - Fatal编程技术网

Python 将包含复杂JSON的CSV导入Postgres

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

我有一个CSV文件,其中一列,
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'