Power Query清洗杂乱txt用户账单数据遇列错位问题求助
解决方案:Power Query 列溢出修复 + Python 替代方案
Power Query 修复列错位的步骤
你当前的问题核心是不同用户的收费项行数不一致,导致合并后列错位。需要在分组后给每个用户的行打上字段标签,再通过透视统一列结构:
回到分组后的子表处理环节:在第6步(按条件列分组)后,不要直接钻取合并,而是对每个分组的子表执行以下操作:
- 添加自定义列,根据行内容判断所属字段:
= Table.AddColumn(当前子表, "字段标签", each if Text.Contains([你的单列名], "C:") then "客户ID" else if Text.Contains([你的单列名], "订阅者姓名") then "订阅者姓名" else if Text.Contains([你的单列名], "当前费用") then "当前费用" else if Text.Contains([你的单列名], "其他费用与信贷") then "其他费用与信贷" else if Text.Contains([你的单列名], "其他杂费") then "其他杂费" else if Text.Contains([你的单列名], "税费") then "税费" else null ) - 过滤掉
字段标签为null的行,只保留目标字段行 - 执行透视列操作:选择
字段标签作为"行",你的内容列作为"值",遇到重复标签时用Text.Combine(合并为文本)或List.Combine(保留列表)聚合内容
- 添加自定义列,根据行内容判断所属字段:
统一列结构:透视后每个子表的列名会自动对齐,空值会填充
null,再用Table.Combine合并所有子表即可得到每行对应一个用户的规整数据。
Python 处理这类场景的优势与实现
对于非结构化、行数量不一致的账单数据,Python确实更灵活高效,尤其是1万行以上的数据集,自动化处理和正则匹配的精准度更高:
核心实现代码
import re import pandas as pd # 读取账单文件 with open('你的账单文件.txt', 'r', encoding='utf-8') as f: raw_content = f.read() # 按分隔符拆分每个用户的账单块 user_blocks = [block.strip() for block in raw_content.split('----------') if block.strip()] # 解析每个用户块的目标字段 parsed_data = [] for block in user_blocks: user_info = {} # 提取C:字段 c_match = re.search(r'C:(.*)', block) if c_match: user_info['C:'] = c_match.group(1).strip() # 提取订阅者姓名(适配冒号中英文格式) name_match = re.search(r'订阅者姓名\s*[::]\s*(.*)', block) if name_match: user_info['订阅者姓名'] = name_match.group(1).strip() # 提取当前费用(多行内容合并) current_fee_lines = re.findall(r'当前费用.*?(?=\n其他费用与信贷|\n其他杂费|\n税费|$)', block, re.DOTALL) if current_fee_lines: user_info['当前费用'] = '\n'.join([line.strip() for line in current_fee_lines]) # 提取其他费用与信贷 other_credit_match = re.search(r'其他费用与信贷\s*[::]\s*(.*?)(?=\n其他杂费|\n税费|$)', block, re.DOTALL) if other_credit_match: user_info['其他费用与信贷'] = other_credit_match.group(1).strip() # 提取其他杂费 misc_fee_match = re.search(r'其他杂费\s*[::]\s*(.*?)(?=\n税费|$)', block, re.DOTALL) if misc_fee_match: user_info['其他杂费'] = misc_fee_match.group(1).strip() # 提取税费 tax_match = re.search(r'税费\s*[::]\s*(.*)', block) if tax_match: user_info['税费'] = tax_match.group(1).strip() parsed_data.append(user_info) # 转换为DataFrame,自动对齐列 result_df = pd.DataFrame(parsed_data) # 保存为CSV或Excel result_df.to_excel('规整后的账单.xlsx', index=False)
优势说明
- 正则匹配可以精准适配不同格式的行内容,无需依赖固定列位置
- 自动处理空值,所有用户的字段会自动对齐到对应列
- 处理1万行数据速度快,且可以轻松扩展到更大数据集
内容的提问来源于stack exchange,提问作者CountryBoy_71
相关产品推荐
相关产品推荐

