如何读取管道分隔文本文件 筛选排序追加metadata后解析为指定JSON
管道分隔文本转指定结构JSON实现方案
直接用Python标准库即可完成需求,无需安装额外依赖,实现逻辑完全匹配要求:
实现步骤
- 读取管道符分隔的文本文件,将第一行识别为表头,跳过空行
- 逐行解析内容时,仅保留
Order/AA/BB/CC四个字段,丢弃不需要的DD字段 - 为每条解析后的记录追加空对象类型的
metadata字段 - 对
BB字段值做截断处理,去掉Cdd.前缀得到实际类型值;将CC字段的true/false字符串转为布尔值,对应nullable字段 - 将所有记录按
Order字段的数值做升序排序 - 按要求组装最终结构,外层固定
type值为struct,处理好的记录存入fields数组,最终输出标准JSON格式
可直接运行的代码
import json # 替换为你的管道分隔文本文件实际路径 INPUT_FILE_PATH = "./data.txt" parsed_records = [] with open(INPUT_FILE_PATH, "r", encoding="utf-8") as f: # 过滤空行 valid_lines = [line.strip() for line in f if line.strip()] # 跳过第一行表头,逐行解析数据 for raw_line in valid_lines[1:]: field_values = raw_line.split("|") # 提取需要的字段并做格式转换 order_num = int(field_values[0]) field_name = field_values[1] field_type = field_values[2].removeprefix("Cdd.") is_nullable = field_values[3].lower() == "true" # 追加metadata字段后存入列表 parsed_records.append({ "_order": order_num, "metadata": {}, "name": field_name, "type": field_type, "nullable": is_nullable }) # 按Order字段数值升序排序 parsed_records.sort(key=lambda x: x["_order"]) # 组装最终结果结构,去掉排序用的临时_order字段 final_result = { "fields": [ { "metadata": record["metadata"], "name": record["name"], "type": record["type"], "nullable": record["nullable"] } for record in parsed_records ], "type": "struct" } # 打印结果,需要写入文件可以放开下方注释 print(json.dumps(final_result, indent=2, ensure_ascii=False)) # with open("./result.json", "w", encoding="utf-8") as f: # json.dump(final_result, f, indent=2, ensure_ascii=False)
运行效果
传入你给出的示例输入文件,运行后输出的JSON完全符合要求:
{ "fields": [ { "metadata": {}, "name": "status3", "type": "Float", "nullable": false }, { "metadata": {}, "name": "status1", "type": "int", "nullable": true }, { "metadata": {}, "name": "status2", "type": "String", "nullable": true } ], "type": "struct" }
注意:如果你的文本文件不是utf-8编码,请对应修改open函数里的encoding参数,避免读取乱码。
内容的提问来源于stack exchange,提问作者Hiwot
相关产品推荐
相关产品推荐

