NSC姓名格式处理方案咨询:SQL或Python实现
实现方案:SQL & Python 两种方式都能搞定
一、分步处理是最优选择
建议拆分步骤执行,原因很直接:
- 每一步单独验证,能快速定位哪一步不符合NSC的要求;
- 后续规则调整时,直接修改对应步骤即可,不用重构整个逻辑;
- 避免把所有规则揉进一个复杂表达式,后期维护起来头疼。
二、SQL实现方案
用CTE分步处理,先清洗名字,再提取中间名首字母:
WITH cleaned_names AS ( SELECT -- 完成规则1+2:替换单引号为空格 → 移除非法字符 → 修剪空格 TRIM(REGEXP_REPLACE(REGEXP_REPLACE(first_name, '''', ' '), '[^a-zA-Z0-9\- ]', '')) AS clean_first, TRIM(REGEXP_REPLACE(REGEXP_REPLACE(last_name, '''', ' '), '[^a-zA-Z0-9\- ]', '')) AS clean_last, middle_name AS original_middle FROM your_table ), extracted_initials AS ( SELECT -- 从First Name提取主名+中间名首字母 REGEXP_SUBSTR(clean_first, '^\w+') AS processed_first_name, REGEXP_SUBSTR(clean_first, ' (\w)', 1, 1, 'i', 1) AS first_middle_initial, -- 从Last Name提取主姓+中间名首字母(按示例提取第一部分首字母) REGEXP_SUBSTR(clean_last, '\w+$') AS processed_last_name, REGEXP_SUBSTR(clean_last, '^(\w)', 1, 1, 'i', 1) AS last_middle_initial, original_middle FROM cleaned_names ) SELECT processed_first_name, -- 合并所有中间名部分,自动去除多余空格 TRIM(CONCAT_WS(' ', original_middle, first_middle_initial, last_middle_initial)) AS processed_middle_name, processed_last_name FROM extracted_initials;
代码说明:
cleaned_names阶段:先把单引号换成空格,再删掉除字母、数字、连字符、空格之外的所有字符,最后修剪首尾空格;extracted_initials阶段:用正则拆分清洗后的名字,提取主名字和中间名首字母;- 最后合并原中间名和新提取的首字母,得到最终的Middle Name字段。
三、Python实现方案(用Pandas)
适合需要更灵活逻辑或者数据不在数据库里的场景:
import pandas as pd import re # 1. 加载数据(替换成你的数据源,比如从数据库读取) df = pd.read_csv('student_data.csv') # 2. 定义名字清洗函数(处理规则1+2) def clean_name(name): if pd.isna(name): return '' # 替换单引号为空格 name = name.replace("'", " ") # 移除非法字符,只保留字母、数字、连字符、空格 name = re.sub(r'[^a-zA-Z0-9\- ]', '', name) # 合并连续空格+修剪首尾 return re.sub(r'\s+', ' ', name).strip() # 3. 清洗First/Last Name df['clean_first'] = df['first_name'].apply(clean_name) df['clean_last'] = df['last_name'].apply(clean_name) # 4. 从First Name提取主名和中间名首字母 def process_first(name): parts = name.split() if len(parts) > 1: return parts[0], parts[1][0].upper() return name, None # 5. 从Last Name提取主姓和中间名首字母(按示例逻辑) def process_last(name): parts = name.split() if len(parts) > 1: return parts[-1], parts[0][0].upper() return name, None # 6. 应用处理函数 df[['processed_first', 'first_mid']] = df['clean_first'].apply(lambda x: pd.Series(process_first(x))) df[['processed_last', 'last_mid']] = df['clean_last'].apply(lambda x: pd.Series(process_last(x))) # 7. 合并所有中间名部分 def combine_middle(original, first_mid, last_mid): parts = [] if original and not pd.isna(original): parts.append(original.strip()) if first_mid: parts.append(first_mid) if last_mid: parts.append(last_mid) return ' '.join(parts) if parts else None df['processed_middle'] = df.apply(lambda row: combine_middle(row['middle_name'], row['first_mid'], row['last_mid']), axis=1) # 8. 输出最终结果 final_result = df[['processed_first', 'processed_middle', 'processed_last']] print(final_result.head())
代码说明:
- 拆分每个规则到单独函数,逻辑清晰;
- 可以轻松调整中间名提取逻辑(比如如果NSC要求提取多个中间名首字母,直接修改拆分逻辑即可);
- 适合处理复杂的边缘情况。
内容的提问来源于stack exchange,提问作者pikachu
相关产品推荐
相关产品推荐

