You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python脚本开发求助:从文本文件提取多字段生成CSV

Python脚本:从文本文件提取数据到CSV

完整脚本

import re
import csv

# 定义需要提取的所有字段及其匹配规则
FIELD_PATTERNS = {
    "CustomerNAME": r"<CustomerNAME>\s*(.*)",
    "DOA": r"<DOA>\s*(.*)",
    "Account": r"<Account>\s*(.*)",
    "DateofPurchase": r"<DateofPurchase>\s*(.*)",
    "Manager": r"Manager:\s*(.*?)(?=\n\S|$)",
    "Requesting Staff": r"Requesting Staff:\s*(.*?)(?=\n\S|$)",
    "Class Name": r"Class Name:\s*(.*?)(?=\n\S|$)",
    "Modle Name": r"Modle Name:\s*(.*?)(?=\n\S|$)",
    "Indication for Lease": r"Indication for Lease:\s*(.*?)(?=\n\S|$)",
    "Expected Duration of Lease": r"Expected Duration of Lease:\s*(.*?)(?=\n\S|$)",
    "Cost of Lease": r"Cost of Lease:\s*(.*?)(?=\n\S|$)",
    "Availability of item": r"Availability of item :\s*(.*?)(?=\n\S|$)",
    "Availabilty of item": r"Availabilty of item :\s*(.*?)(?=\n\S|$)",  # 处理拼写差异
    "Decision": r"Decision:\s*(.*?)(?=\n\S|$)",
    "Rationale for Approval": r"Rationale for Approval:\s*(.*?)(?=\n\S|$)",
    "Comment": r"Comment:\s*(.*?)(?=\n\s*<<END OF REPORT>>|$)",
}

def extract_data_from_text(text):
    # 分割出每个条目:<NEW FILE> 到 <<END OF REPORT>>
    entries = re.findall(r"<NEW FILE>(.*?)<<END OF REPORT>>", text, re.DOTALL)
    data = []
    
    for entry in entries:
        entry_data = {}
        for field_name, pattern in FIELD_PATTERNS.items():
            match = re.search(pattern, entry, re.DOTALL)
            if match:
                # 去除前后空白,处理多行注释
                value = match.group(1).strip()
                # 替换换行符为空格(针对多行Comment)
                value = re.sub(r"\s+", " ", value)
                entry_data[field_name] = value
            else:
                entry_data[field_name] = ""  # 字段不存在时留空
        
        # 合并拼写不同的库存字段(示例中有Availability/Availabilty)
        if entry_data.get("Availabilty of item"):
            entry_data["Availability of item"] = entry_data.pop("Availabilty of item")
        
        data.append(entry_data)
    return data

def write_to_csv(data, output_file):
    # 获取所有字段名作为CSV表头
    fieldnames = [key for key in FIELD_PATTERNS.keys() if key != "Availabilty of item"]
    with open(output_file, "w", newline="", encoding="utf-8") as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writeheader()
        writer.writerows(data)

if __name__ == "__main__":
    # 读取输入文本文件
    with open("input.txt", "r", encoding="utf-8") as f:
        text_content = f.read()
    
    # 提取数据
    extracted_data = extract_data_from_text(text_content)
    
    # 写入CSV
    write_to_csv(extracted_data, "output.csv")
    print("数据提取完成,已保存到output.csv")

关键步骤解释

  1. 定义字段匹配规则:

    • XML风格标签(如<CustomerNAME>)直接匹配标签后的内容
    • 普通文本标签(如Manager:)用(?=\n\S|$)作为终止条件,自动匹配标签后到下一个非空行或条目结束的内容,兼容标签同行/下一行的情况
    • 单独处理Comment字段,匹配直到<<END OF REPORT>>的多行文本
  2. 分割条目:

    • 用re.findall结合re.DOTALL(让.匹配换行符),精准提取每个<NEW FILE>到<<END OF REPORT>>之间的内容
  3. 数据清洗:

    • 用strip()去除字段值前后空白
    • 多行文本(如Comment)将换行和多空格替换为单个空格
    • 合并拼写差异字段(示例中的Availability/Availabilty)
  4. 写入CSV:

    • 使用csv.DictWriter自动生成表头和每行数据,确保每条条目对应CSV的一行,缺失字段留空

使用说明

  • 将你的文本文件保存为input.txt,和脚本放在同一目录
  • 运行脚本后,生成output.csv文件,所有字段按表头排列

内容的提问来源于stack exchange,提问作者NickO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 22:40:25