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

如何将固定结构文本文件的行数据按规则转换为CSV列数据

固定结构文本转CSV实现方案

核心思路是按块解析、固定字段提取、参数行展开三个阶段处理,不需要复杂的文本解析库,用基础的逐行遍历+正则匹配就能实现:

  • 第一阶段:文本预处理与块切分
    逐行读取原始文件,过滤空行、去除每行首尾多余空白字符;用正则匹配数字 + CONTINUE格式的块起始行,每匹配到一次就代表上一个数据块结束、新块开始,初始化新块的字段存储结构。
  • 第二阶段:块内字段分类提取
    对单个块内的每一行按格式特征匹配,分别提取对应内容:
    • 匹配A:/B:/C:/D:开头的行,提取冒号后的内容作为对应Var_A/Var_B/Var_C/Var_D的固定值
    • 匹配Something开头的行,提取后面的内容作为Something字段的固定值
    • 匹配$开头、带等号的参数行,提取$和等号之间的参数名,统一存入当前块的参数列表,不直接生成记录
  • 第三阶段:记录展开与CSV输出
    单个块的所有行解析完成后,遍历参数列表做行展开:有多少个参数项就生成多少条记录,每条记录的Number、Var_A到Var_D、Something字段都复用当前块提取的固定值,Parameter列填充对应参数名;最后先写表头,再把所有展开后的记录写入CSV文件即可,写入时注意自动转义字段里的逗号、换行特殊字符,避免格式错乱。

参考实现代码(Python)

import csv
import re

current_block = None
param_collect = []
result_rows = []

# 读取输入文件,替换为实际文件路径
with open("input.txt", "r", encoding="utf-8") as f:
    for raw_line in f:
        line = raw_line.strip()
        if not line:
            continue
        # 匹配块起始标记
        block_head = re.match(r"^(\d+)\s+CONTINUE$", line)
        if block_head:
            # 先处理上一个已解析完成的块
            if current_block:
                for param_name in param_collect:
                    result_rows.append([
                        current_block["num"],
                        current_block["A"],
                        current_block["B"],
                        current_block["C"],
                        current_block["D"],
                        current_block["something"],
                        param_name
                    ])
            # 初始化新块
            current_block = {
                "num": block_head.group(1),
                "A": "", "B": "", "C": "", "D": "", "something": ""
            }
            param_collect = []
            continue
        # 提取A-D类键值对
        abcd_match = re.match(r"^([ABCD]):(.*)$", line)
        if abcd_match:
            key = abcd_match.group(1)
            current_block[key] = abcd_match.group(2).strip()
            continue
        # 提取Something字段
        sth_match = re.match(r"^Something\s+(.*)$", line)
        if sth_match:
            current_block["something"] = sth_match.group(1).strip()
            continue
        # 提取$开头的参数名
        param_match = re.match(r"^\$(\w+)\s*=", line)
        if param_match:
            param_collect.append(param_match.group(1))
    # 处理文件末尾最后一个块
    if current_block:
        for param_name in param_collect:
            result_rows.append([
                current_block["num"],
                current_block["A"],
                current_block["B"],
                current_block["C"],
                current_block["D"],
                current_block["something"],
                param_name
            ])

# 写入CSV文件
with open("output.csv", "w", encoding="utf-8", newline="") as f:
    # 如果需要和示例一样用|做分隔符,把下面一行改成 writer = csv.writer(f, delimiter="|")
    writer = csv.writer(f)
    writer.writerow(["Number", "Var_A", "Var_B", "Var_C", "Var_D", "Something", "Parameter"])
    writer.writerows(result_rows)

注意:如果原始文本里的字段内容包含逗号、双引号、换行这类CSV特殊字符,Python自带的csv库会自动做转义处理,不需要额外写转义逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:42:17