如何用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)
代码说明
数据拆分逻辑:
- 拆分开头的
S.XX*字段,分离出前缀(S)、编号(XX)、标记位(*或空) - 使用
csv.reader按空格分隔原始数据,自动跳过连续空格,避免多空格导致的拆分错误
- 拆分开头的
错误检测规则:
- 字段数量校验:确保拆分后有10个字段,匹配示例的正常结构
- 胜负值校验:限制为
L(负)或W(胜) - 比分格式校验:强制为
数字-数字的标准形式 - 让分格式校验:仅允许
-数字或-数字'格式 - 大小分格式校验:仅允许
u数字/u数字'或o数字/o数字'格式
输出处理:
- 正确行写入目标CSV,可选添加表头提升可读性
- 错误行单独写入错误CSV,包含行号、错误信息和处理后的内容,便于定位和修复问题
内容的提问来源于stack exchange,提问作者user19709842
相关产品推荐
相关产品推荐

