如何用Python解析以‘/’和‘//’为分隔符的纯文本并转JSON?
解析自定义分隔文本并转换为JSON的实现方案
记录结构分析
你的文本记录有以下特征:
- 单条完整记录由多行组成,以
//标记结束 - 元素用单斜杠
/分隔,短横-表示空值 - 示例完整记录:
US/CIV/JOHN SMITH/-/-/Z/-/2018-03-25/BLUE/
159/AZ/AUDI/2015//
实现步骤(以Python为例)
- 读取并拼接完整记录:逐行读取文本,积累元素直到遇到
//结尾的行,形成单条完整记录 - 处理空值与元素拆分:拆分元素后将
-转为null(JSON标准空值),过滤掉拆分产生的空字符串 - 字段映射与JSON转换:给元素指定业务字段名,将记录转为字典后序列化为JSON
代码示例
import json # 请根据实际业务需求修改字段名 FIELD_NAMES = [ "country", "identity", "name", "field_4", "field_5", "field_6", "field_7", "date", "color", "id", "state", "car_brand", "car_year" ] def parse_text_to_json(file_path): records = [] current_elements = [] with open(file_path, 'r', encoding='utf-8') as f: for line in f: stripped_line = line.strip() if not stripped_line: continue # 拆分当前行元素,过滤空字符串(行尾/导致的空元素) line_elements = [elem for elem in stripped_line.split('/') if elem] if stripped_line.endswith('//'): # 移除//拆分出的最后一个空元素 line_elements = line_elements[:-1] current_elements.extend(line_elements) # 处理空值:将'-'转为None(JSON序列化后为null) processed_elements = [None if elem == '-' else elem for elem in current_elements] # 映射字段名,生成记录字典 record = dict(zip(FIELD_NAMES[:len(processed_elements)], processed_elements)) records.append(record) current_elements = [] else: current_elements.extend(line_elements) # 序列化为格式化的JSON字符串 return json.dumps(records, indent=2, ensure_ascii=False) # 调用示例(替换为你的文件路径) # result = parse_text_to_json("your_records.txt") # print(result)
关键说明
- 字段名定义:原记录没有字段标识,必须根据业务场景自定义
FIELD_NAMES,确保每个元素对应正确的业务含义 - 空值处理:代码中将
-转为None,JSON输出时会变成null,符合JSON的空值规范 - 边界处理:自动跳过空行,过滤拆分产生的空元素,避免无效数据干扰
示例输出
处理你提供的示例文本后,输出的JSON格式如下:
[ { "country": "US", "identity": "CIV", "name": "JOHN SMITH", "field_4": null, "field_5": null, "field_6": "Z", "field_7": null, "date": "2018-03-25", "color": "BLUE", "id": "159", "state": "AZ", "car_brand": "AUDI", "car_year": "2015" }, { "country": "US", "identity": "CTR", "name": "BILL STONE", "field_4": "5", "field_5": "TEXT", "field_6": "G", "field_7": "AU24", "date": "2021-06-18", "color": "GREEN", "id": "174", "state": "CO", "car_brand": "BENZ", "car_year": "2019" } ]
内容的提问来源于stack exchange,提问作者Jeremy M
相关产品推荐
相关产品推荐

