如何将固定结构文本文件的行数据按规则转换为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
相关产品推荐
相关产品推荐

