基于文本规则将TXT内容拆分至Excel多列的Jupyter代码问题排查
基于文本规则将TXT内容拆分至Excel多列的Jupyter代码问题排查
我仔细看了你的需求和现有代码,发现几个关键逻辑问题导致没拿到预期的Excel输出,咱们一步步来修正:
现有代码的核心问题
- 处理“and”开头行时的拆分错误:
当你拆分and 02RE0JD Replacement of Left gear时,用split(maxsplit=1)得到的第一个元素是and,而不是你需要的大写代码02RE0JD。后续检查subcode[0].isalnum()自然会失败,导致code_id_2和code_desc_2被填入空值,这完全不符合你的需求。 - 逻辑配对不严谨:
原代码在遍历主行时,仅检查下一行是否是and行,但没有正确提取and行里的有效内容,同时也没考虑如果连续多个主行没有对应and行的情况(比如第一个主行的下一行是另一个主行)。
修正后的代码
import re import pandas as pd # 读取文本文件 with open('11.txt', 'r') as f: text = f.read() # 初始化存储数据的列表 code_id = [] code_desc = [] code_id_2 = [] code_desc_2 = [] # 按行拆分,过滤空行 lines = [line.strip() for line in text.split('\n') if line.strip()] i = 0 while i < len(lines): line = lines[i] # 匹配主行:以大写字母数字开头(排除VRG/DDC) main_match = re.match(r'^(?!VRG|DDC)([A-Z0-9]+)\s+(.*)$', line) if main_match: # 提取主行的code和描述 main_code = main_match.group(1) main_desc = main_match.group(2).strip() code_id.append(main_code) code_desc.append(main_desc) # 检查下一行是否是and开头的子行 sub_code = "" sub_desc = "" if i + 1 < len(lines): next_line = lines[i+1] sub_match = re.match(r'^\s*and\s+([A-Z0-9]+)\s+(.*)$', next_line) if sub_match: sub_code = sub_match.group(1) sub_desc = sub_match.group(2).strip() # 跳过已经处理的子行 i += 1 code_id_2.append(sub_code) code_desc_2.append(sub_desc) i += 1 # 创建DataFrame并写入Excel df = pd.DataFrame({ 'code_id': code_id, 'code_desc': code_desc, 'code_id_2': code_id_2, 'code_desc_2': code_desc_2 }) df.to_excel('1.xlsx', index=False)
关键改动说明
- 用正则直接提取内容:
不管是主行还是and行,都用正则一次性提取出代码和描述,避免了拆分字符串的错误,同时保证了匹配的准确性。比如主行的正则^(?!VRG|DDC)([A-Z0-9]+)\s+(.*)$直接捕获大写代码和后面的所有描述;and行的正则^\s*and\s+([A-Z0-9]+)\s+(.*)$跳过开头的and,直接提取子代码和描述。 - 用while循环处理行配对:
当检测到and行时,直接跳过该行(i +=1),避免重复处理,同时确保每个主行只对应一个子行(如果存在的话)。 - 过滤空行:
先对所有行做strip()并过滤空行,避免因文本里的空行导致逻辑错误。
测试结果
用你给出的示例文本运行修正后的代码,会得到完全符合预期的Excel输出:
| code_id | code_desc | code_id_2 | code_desc_2 |
|---|---|---|---|
| 03YT0Z1 | Transplantation of vehicle | ||
| 05RF0JE | Replacement of Right gear | 02RE0JD | Replacement of Left gear |
备注:内容来源于stack exchange,提问作者Anand Babu
相关产品推荐
相关产品推荐

