如何将CSV中姓名列转换为JSON的嵌套字段结构?
我来帮你搞定这个需求!要把CSV里的NAME列转换成包含last_name、prefix、first_name的嵌套JSON对象,我们不能只做简单的字符串拆分,得专门写一个姓名解析逻辑来处理不同格式和缺失值的情况。
实现思路
- 编写一个姓名解析函数,覆盖三种场景:完整姓名(姓氏, 称谓. 名字)、缺失值、以及格式不完整的情况。
- 针对称谓全称转缩写的需求(比如
Doctor转Dr.),添加一个映射表来统一格式。 - 把解析后的结果包装成你需要的列表嵌套结构,替换原代码里的简单拆分。
完整代码
import csv import json def parse_full_name(name_input): # 处理缺失值或空字符串的情况 cleaned_input = name_input.strip() if not cleaned_input or cleaned_input == "Missing Value": return { "last_name": "Missing Value", "prefix": "Missing Value", "first_name": "Missing Value" } # 拆分姓氏和后续部分(只拆分一次,避免姓氏里含逗号的特殊情况) last_name_part, rest_part = cleaned_input.split(",", 1) last_name = last_name_part.strip() # 处理称谓和名字部分,按". "拆分(确保只拆分称谓后的点空格) rest_cleaned = rest_part.strip() if ". " not in rest_cleaned: # 没有找到称谓分隔符的情况,默认称谓缺失 return { "last_name": last_name, "prefix": "Missing Value", "first_name": rest_cleaned } prefix_part, first_name_part = rest_cleaned.split(". ", 1) # 称谓全称与缩写的映射表,可根据实际需求扩展 title_abbrev_map = { "Mr": "Mr.", "Mrs": "Mrs.", "Doctor": "Dr.", "Dr": "Dr.", "Ms": "Ms.", "Miss": "Ms.", "Professor": "Prof." } # 统一处理称谓格式:去掉可能的尾点,再匹配映射 prefix_key = prefix_part.strip().rstrip(".") prefix = title_abbrev_map.get(prefix_key, f"{prefix_key}.") first_name = first_name_part.strip() return { "last_name": last_name, "prefix": prefix, "first_name": first_name } with open('test.csv', 'r') as file: headers = next(file) fieldnames = headers.rstrip().split(",") csv_reader = csv.DictReader(file, fieldnames=fieldnames) for row_dict in csv_reader: # 解析姓名并包装成指定的列表嵌套结构 parsed_name = parse_full_name(row_dict['name']) row_dict['name'] = [parsed_name] # 输出格式化后的JSON print(json.dumps(row_dict))
关键细节说明
- 缺失值处理:当
NAME列是空值或标记为Missing Value时,三个字段都会设为Missing Value,符合你的需求。 - 安全拆分:拆分姓氏时只拆分一次逗号,避免像
O'Neil, Jr., Mr. Mike这类带逗号的姓氏被错误拆分。 - 称谓映射:通过
title_abbrev_map可以轻松扩展更多称谓的缩写规则,比如把Professor转成Prof.。 - 格式容错:如果遇到没有
.分隔符的姓名(比如Smith, Bob),会默认称谓缺失,名字设为后续内容,提高代码的鲁棒性。
用你的测试CSV运行这段代码,就能得到你期望的嵌套JSON输出啦!
内容的提问来源于stack exchange,提问作者sharp
相关产品推荐
相关产品推荐

