替换JSON文件字典列表空值/X为浮点值 适配PostgreSQL导入
PostgreSQL导入前置JSON数据清洗方案
针对9000条结构统一的字典类JSON数据,采用字段白名单定向清洗的方案即可,不会误改非目标字段,处理性能完全满足要求。
核心清洗规则对齐
- 仅对提前圈定的浮点/数值类型字段做处理,文本类型字段、整数字段完全保留原值
- 数值字段中仅将非法值
""(空字符串)、"X"(标记值)替换为浮点数0.0001 - 数值字段中原生整数、浮点数、可转浮点的合法数字字符串(如
"0.05"、"0")全部保留,不做额外转换 - 注:你提供的期望样例中前两条记录
steuerpflichtig字段替换为0.0001属于笔误,该字段原始值为合法数字字符串"0",按需求应当保留,下述代码严格遵循该规则。
可直接运行的实现代码
采用Python实现,无额外依赖,处理全量数据耗时在100ms以内:
import json # -------------------------- # 配置项:按实际表结构修改 # -------------------------- # 从PostgreSQL目标表中筛选出的所有浮点/数值类型字段名 FLOAT_FIELD_LIST = { "ursprungsauftrag", "umsatz", "brutto", "vertrauensschadenhaftpflicht", "stornoreserve", "umsatzsteuer_betrag", "netto", "steuerpflichtig" } # 需要替换的非法值集合 ILLEGAL_VAL = {"", "X"} # 替换后的目标值 REPLACE_VAL = 0.0001 # 1. 读取原始JSON文件 with open("raw_data.json", "r", encoding="utf-8") as f: raw_records = json.load(f) # 2. 逐记录清洗 cleaned_records = [] for item in raw_records: current = item.copy() for field in FLOAT_FIELD_LIST: field_val = current.get(field) # 仅当字段值为字符串且属于非法值时替换,其余情况不动 if isinstance(field_val, str) and field_val in ILLEGAL_VAL: current[field] = REPLACE_VAL cleaned_records.append(current) # 3. 导出清洗后文件 with open("cleaned_for_pg.json", "w", encoding="utf-8") as f: json.dump(cleaned_records, f, ensure_ascii=False, indent=2)
校验与导入注意事项
- 不要使用「尝试将所有值转为float,转换失败则替换」的逻辑,该逻辑会误将文本字段的非数字内容(如样例中的
"Rechnung")替换为0.0001,导致数据错误。 - 若不想手动维护浮点字段清单,可直接查询PostgreSQL系统表自动获取字段列表,执行以下SQL即可拿到对应表的所有数值类字段:
SELECT column_name FROM information_schema.columns WHERE table_name = '你的目标表名' AND data_type IN ('numeric', 'real', 'double precision');
- 清洗完成后可执行快速校验,确认无非法值残留,校验通过即可直接导入:
residual_error = 0 for record in cleaned_records: for field in FLOAT_FIELD_LIST: val = record[field] if isinstance(val, str) and val in ILLEGAL_VAL: residual_error += 1 print(f"残留非法值数量:{residual_error}") # 输出为0即表示清洗合格
内容的提问来源于stack exchange,提问作者Anthony Admin
相关产品推荐
相关产品推荐

