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

如何用Python解析结构化EMP.txt数据文件并转换为CSV格式?

自动解析固定宽度文本转CSV的Python方案

太懂这种手动写几十上百个切片的痛苦了——不仅效率低,还容易因为数错长度搞出bug。咱们完全可以通过自动读取结构文件生成字段映射的方式,批量处理固定宽度数据,轻松转成标准CSV。下面是具体实现思路和代码:

核心逻辑

  1. 先解析结构文件EMPSTRU.txt,提取每个字段的名称和长度,自动计算出每个字段在记录中的起始/结束索引(不用手动数位置)。
  2. 读取数据文件EMP.txt时,按结构文件算出的单条记录总长度分割数据(毕竟你的示例数据是连续无换行的),避免依赖换行符。
  3. 用Python内置的csv模块批量写入解析后的字段,生成易读易处理的CSV文件。

完整代码实现

import csv

def parse_structure(struct_file_path):
    """解析结构文件,返回字段名列表和每个字段的(start, end)切片索引"""
    fields = []
    field_indices = []
    current_position = 0
    
    with open(struct_file_path, 'r') as f:
        for line in f:
            # 拆分每行内容,适配"001 EMPID LENGTH 2"这种格式
            parts = line.strip().split()
            if len(parts) >= 4:
                field_name = parts[1]
                field_length = int(parts[3])
                fields.append(field_name)
                # 按Python切片的左闭右开规则计算索引
                field_indices.append((current_position, current_position + field_length))
                current_position += field_length
    
    return fields, field_indices

def fixed_width_to_csv(data_file_path, struct_file_path, output_csv_path):
    # 第一步:解析结构文件,拿到字段和索引映射
    fields, field_indices = parse_structure(struct_file_path)
    # 计算单条记录的总长度,用来分割大文件
    record_total_length = sum(end - start for start, end in field_indices)
    
    # 处理大文件,逐条读取避免内存溢出
    with open(data_file_path, 'r') as data_f, open(output_csv_path, 'w', newline='') as csv_f:
        writer = csv.DictWriter(csv_f, fieldnames=fields)
        writer.writeheader()  # 写入CSV表头
        
        while True:
            # 读取单条记录的内容
            record = data_f.read(record_total_length)
            if not record:
                break  # 读取完毕,退出循环
            
            # 解析当前记录的所有字段
            record_data = {}
            for field_name, (start, end) in zip(fields, field_indices):
                # 可选:去掉字段首尾空白,如果你需要保留原始空格可以删掉.strip()
                record_data[field_name] = record[start:end].strip()
            
            writer.writerow(record_data)

# 调用示例,替换成你的文件路径
if __name__ == "__main__":
    fixed_width_to_csv(
        data_file_path="EMP.txt",
        struct_file_path="EMPSTRU.txt",
        output_csv_path="EMP_parsed.csv"
    )

代码细节说明

  • 结构解析函数:不管你有150还是200个字段,它都会自动遍历结构文件,计算每个字段的切片位置,完全不用手动写Dataline[0:2]这种代码。
  • 大文件友好:用read(record_total_length)逐条读取记录,不会一次性把75MB的文件塞进内存,处理大文件更稳妥。
  • CSV写入:用DictWriter按字段名写入,生成的CSV表头清晰,后续用Excel、Pandas处理都很方便。
  • 灵活调整:如果你的数据需要保留字段内的原始空格(比如姓名中间的空格),直接去掉代码里的.strip()就行;如果记录长度有异常,还可以加个长度校验的逻辑。

测试验证

用你给出的示例数据测试时:

  • 结构文件会解析出EMPID(0,2)、EMPNAME(2,12)等7个字段的索引
  • 示例数据会被分割成两条48长度的记录(总长度2+10+1+10+10+5+10=48),解析后写入CSV的内容完全符合字段定义,不会出现错位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:16:15