You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

代码说明:

  1. cleaned_names 阶段:先把单引号换成空格,再删掉除字母、数字、连字符、空格之外的所有字符,最后修剪首尾空格;
  2. extracted_initials 阶段:用正则拆分清洗后的名字,提取主名字和中间名首字母;
  3. 最后合并原中间名和新提取的首字母,得到最终的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 20:47:35