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

如何用Python拆分原始数据为CSV/Excel并识别格式错误行

原始数据拆分CSV及错误行识别方案

需求概述

  • 将空格分隔的原始体育数据拆分为标准CSV格式,处理开头的S.XX*格式,拆分出前缀、编号、标记位(*或空)
  • 识别拆分过程中出现的格式错误行,包括字段缺失、字段格式不符合规则(如比分拼接错误、胜负值非法等)

示例数据

原始输入数据

S.11*  N. ENGLAND           L      -8'    21-23  u44'
S.18    TAMPA BAY            W     -7     40-7    u49'
S.25    Buffalo                       L      -4'    18-33  o48

期望CSV输出

S,11,*,N.,ENGLAND,L,-8',21-23,u44'
S,18,,TAMPA,BAY,W,-7,40-7,u49'
S,25,,Buffalo,L,-4',18-33,o48

错误行示例(需识别)

S,11,N.,ENGLAND,L,-8',21-23u,44'

改进后的实现代码

import csv
import re

input_filename = 'rawsample.txt'
output_filename = 'spreads.csv'
error_filename = 'error_rows.csv'

# 定义格式验证规则
def validate_row(row):
    # 规则1:字段数量必须为10(匹配示例正常行的结构)
    if len(row) != 10:
        return False, "字段数量不符"
    
    # 规则2:胜负字段只能是L或W
    if row[5] not in ['L', 'W']:
        return False, "胜负值非法"
    
    # 规则3:比分字段必须是XX-XX格式
    score_pattern = re.compile(r'^\d+-\d+$')
    if not score_pattern.match(row[7]):
        return False, "比分格式错误"
    
    # 规则4:让分字段格式验证(允许-数字或-数字')
    spread_pattern = re.compile(r'^-\d+\'?$')
    if not spread_pattern.match(row[6]):
        return False, "让分格式错误"
    
    # 规则5:大小分字段格式验证(u/o+数字'?)
    total_pattern = re.compile(r'^[uo]\d+\'?$')
    if not total_pattern.match(row[9]):
        return False, "大小分格式错误"
    
    return True, "验证通过"

with open(input_filename, 'r', newline='') as infile, \
     open(output_filename, 'w', newline='') as outfile, \
     open(error_filename, 'w', newline='') as errorfile:
    
    reader = csv.reader(infile, delimiter=' ', skipinitialspace=True)
    writer = csv.writer(outfile, delimiter=',')
    error_writer = csv.writer(errorfile, delimiter=',')
    
    # 写入CSV表头(可选,方便后续查看)
    writer.writerow(['前缀', '编号', '标记', '球队前缀', '球队名称', '胜负', '让分', '比分', '大小分前缀', '大小分'])
    
    for line_num, row in enumerate(reader, start=1):
        # 处理开头的S.XX*格式
        first_col = row[0]
        new_cols = first_col.split('.')
        if len(new_cols) != 2:
            # 开头格式错误,直接标记为错误行
            error_writer.writerow([line_num, "开头格式错误"] + row)
            continue
        
        prefix, num_part = new_cols
        if num_part.endswith('*'):
            num = num_part[:-1]
            mark = '*'
        else:
            num = num_part
            mark = ''
        
        # 重组行数据
        processed_row = [prefix, num, mark] + row[1:]
        
        # 验证行格式
        is_valid, msg = validate_row(processed_row)
        if is_valid:
            writer.writerow(processed_row)
        else:
            # 错误行记录行号、错误信息和处理后的内容,方便排查
            error_writer.writerow([line_num, msg] + processed_row)

print("处理完成,结果已保存到", output_filename)
print("错误行已保存到", error_filename)

代码说明

  1. 数据拆分逻辑:

    • 拆分开头的S.XX*字段,分离出前缀(S)、编号(XX)、标记位(*或空)
    • 使用csv.reader按空格分隔原始数据,自动跳过连续空格,避免多空格导致的拆分错误
  2. 错误检测规则:

    • 字段数量校验:确保拆分后有10个字段,匹配示例的正常结构
    • 胜负值校验:限制为L(负)或W(胜)
    • 比分格式校验:强制为数字-数字的标准形式
    • 让分格式校验:仅允许-数字或-数字'格式
    • 大小分格式校验:仅允许u数字/u数字'或o数字/o数字'格式
  3. 输出处理:

    • 正确行写入目标CSV,可选添加表头提升可读性
    • 错误行单独写入错误CSV,包含行号、错误信息和处理后的内容,便于定位和修复问题

内容的提问来源于stack exchange,提问作者user19709842

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:52:34