如何合并文本文件中符合条件的连续数字行并导出为CSV
处理文本文件生成目标CSV/空格分隔文件
你需要处理一份文本文件,提取连续的、以数字开头且不含“not eligible”的行,将这些行里的关键数字内容合并后导出为目标格式文件。
文本文件示例
Date Printed 09/21/22 Batch Number 1481499 109797295 Xie Wei Yan eligible 3503 2 1 New Zealand Certificate in Aquatics WARNING Name Mismatch: Xie Weiyan 120106533 Cheesbrough Joanne not eligible 3507 4 1 New Zealand Certificate in Aquatics (Specialised Swim and Water Safety Teacher) WARNING Name Mismatch: Cheesbrough Joanne Mary 123012179 Wood James Michael eligible 3417 4 1 New Zealand Certificate in Entertainment and Event Technology 123012179 Wood James Michael eligible 3417 3 1 New Zealand Certificate in Entertainment and Event Technology
预期输出
109797295 3503 2 1 123012179 3417 4 1 123012179 3417 3 1
你当前已能提取数字开头的行,但还不会过滤含“not eligible”的行,也不知道如何合并符合条件的连续行并写入目标文件,现有代码如下:
with open('qualstatusall.txt') as r: for line in r: if line and line[0].isdigit(): # no need to compare against True print(line.strip())
完整实现代码(输出空格分隔格式)
with open('qualstatusall.txt', 'r') as input_file, open('output.txt', 'w') as output_file: current_user_id = None for line in input_file: stripped_line = line.strip() # 跳过空行 if not stripped_line: continue # 处理用户ID行(数字开头) if stripped_line[0].isdigit(): # 过滤含"not eligible"的行,重置ID避免后续匹配 if 'not eligible' in stripped_line: current_user_id = None continue # 提取用户ID(第一个数字字段) current_user_id = stripped_line.split()[0] else: # 处理资格信息行,仅当有有效用户ID时才合并 if current_user_id is not None and stripped_line[0].isdigit(): # 提取资格行的前三个数字字段 qual_fields = stripped_line.split()[:3] # 合并并写入文件 output_file.write(f"{current_user_id} {' '.join(qual_fields)}\n") # 重置ID,防止重复匹配 current_user_id = None
代码说明
- 过滤无效行:遇到数字开头且包含
not eligible的行时,重置current_user_id,后续对应的资格行不会被处理。 - 配对连续行:用
current_user_id暂存符合条件的用户ID,当遇到下一行数字开头的资格信息行时,将用户ID和资格字段合并写入。 - 跳过空行:避免空行干扰行的配对逻辑。
如果需要标准CSV格式(逗号分隔),可以改用Python内置的csv模块,代码如下:
import csv with open('qualstatusall.txt', 'r') as input_file, open('output.csv', 'w', newline='') as output_file: csv_writer = csv.writer(output_file) current_user_id = None for line in input_file: stripped_line = line.strip() if not stripped_line: continue if stripped_line[0].isdigit(): if 'not eligible' in stripped_line: current_user_id = None continue current_user_id = stripped_line.split()[0] else: if current_user_id is not None and stripped_line[0].isdigit(): qual_fields = stripped_line.split()[:3] csv_writer.writerow([current_user_id] + qual_fields) current_user_id = None
内容的提问来源于stack exchange,提问作者Jay Weera
相关产品推荐
相关产品推荐

