固定长度文件需依据字段描述文档按位置截取字段,注意编码、对齐、空格及控制字符;逐行读取并生成XML,避免内存溢出。

确认固定长度文件的字段定义和分隔规则
固定长度文件没有显式分隔符,字段靠起始/结束位置界定。转换前必须拿到准确的字段描述文档(如 COBOL COPYBOOK、Excel 字段映射表或 README),否则解析必然出错。substr() 或 slice() 取值时偏移错误,会导致整行 XML 数据错位。
- 字段顺序、长度(含空格填充)、是否右对齐需一一核对
- 注意首行是否为标题行,是否跳过;末尾是否有控制字符(如
\r\n或\x1A) - 常见陷阱:把“长度 10”理解为 UTF-8 字节数,实际可能是 EBCDIC 或 GBK 编码下的字节数——需用对应编码读取文件,否则
slice(0,10)会切坏中文
逐行读取并按位置提取字段生成 XML 元素
Python 和 Bash 最常用,但逻辑一致:打开文件 → 按行迭代 → 对每行用预设位置截取字段 → 组装为 内嵌子元素。不建议一次性加载全文到内存,尤其文件 >100MB 时易 OOM。
with open('data.txt', 'r', encoding='gbk') as f:
for line in f:
line = line.rstrip('\r\n')
if len(line) < 50: # 跳过过短脏行
continue
record = {
'id': line[0:8].strip(),
'name': line[8:28].strip(),
'amount': line[28:38].strip(),
'date': line[38:46].strip()
}
print(f'{record["id"]} {record["name"]} {record["amount"]} {record["date"]} ')处理特殊字符与 XML 实体转义
原始字段中若含 、&、" 等,直接拼接会导致 XML 格式损坏。不能只靠 .replace() 简单替换,需严格遵循 XML 规范:仅对文本内容做转义,不碰标签结构。
-
&→&,→zuojiankuohaophpcn,>→youjiankuohaophpcn - 避免双重转义:已含
&的字段再转一次就变成& - 推荐用标准库:Python 用
xml.sax.saxutils.escape(),Java 用StringEscapeUtils.escapeXml11()
验证输出 XML 是否格式良好且符合 Schema
生成后立即用 xmllint 或 Python 的 xml.etree.ElementTree.parse() 加载校验,能快速暴露未闭合标签、非法字符、编码不一致等问题。如果目标系统要求特定命名空间或根元素名(如 ),这些必须在生成阶段写死,后期补加容易遗漏。
- 命令行快速验证:
xmllint --noout output.xml - 检查编码声明是否匹配文件实际编码(如文件是
GBK,但 XML 声明写,解析器会报错 - 字段为空时,应输出空标签
还是,需按下游系统要求统一
字段位置定义不准、编码误判、特殊字符漏转义——这三个点只要踩中一个,生成的 XML 就无法被下游正常消费。别依赖“看起来像 XML”来判断成功。









