如何解析每行结构不同且含无效行的TXT文件中的目标数据
非结构化固定排版TXT数据解析方法
核心思路
你提供的文本属于固定字段+固定排版的半结构化文本,不需要做复杂的NLP处理,按关键词匹配+固定位置切分就能100%准确提取所需字段。
分步操作
- 第一步:过滤无效行
直接跳过全为分隔符横线的行,以及不需要的无关表头行,只保留包含目标字段的行。 - 第二步:提取数值类字段(Days、Holidays、Salary、Tax等)
这类字段的关键词固定,直接用正则匹配关键词后跟随的数值即可,示例正则规则:Days匹配规则:
Days\s+(\d+),提取第一分组值即可得到20
Holidays匹配规则:Holidays\s+(\d+),提取第一分组值即可得到3
薪资、税额类带小数的字段匹配规则:Salary\s+(\d+\.\d{2})、Tax\s+(\d+\.\d{2}) - 第三步:提取公司、人员姓名字段
第二行的排版固定为[公司名称] + 多空格分隔 + [姓名 中间名 姓氏],两种提取方式可选:- 按固定偏移量切分:观察排版可知姓名区域从行首第20个字符左右开始,直接按字符位置切割行内容,前半段去首尾空格得公司名,后半段去首尾空格得完整姓名
- 按多空格分隔:用正则
\s{3,}(匹配3个及以上连续空格)把第二行切成两部分,第一部分去掉开头的Company字符串得公司名,第二部分就是完整姓名
示例代码(Python)
import re # 读取文件所有行 with open("你的文件路径.txt", "r", encoding="utf-8") as f: lines = f.readlines() result = {} for line in lines: line = line.strip() # 跳过空行和分隔线行 if not line or line.startswith("---"): continue # 匹配数值字段 if "Days" in line: result["days"] = int(re.search(r"Days\s+(\d+)", line).group(1)) if "Holidays" in line: result["holidays"] = int(re.search(r"Holidays\s+(\d+)", line).group(1)) if "Salary" in line: result["salary"] = float(re.search(r"Salary\s+(\d+\.\d{2})", line).group(1)) if "Tax" in line: result["tax"] = float(re.search(r"Tax\s+(\d+\.\d{2})", line).group(1)) # 匹配公司和姓名行 if line.startswith("Company"): parts = re.split(r"\s{3,}", line) result["company"] = parts[0].replace("Company", "").strip() result["full_name"] = parts[1].strip() print(result)
内容的提问来源于stack exchange,提问作者LeRamme
相关产品推荐
相关产品推荐

