SSIS带空格分隔符的不规则右对齐文件读取异常求助
解决遗留不规则右对齐/固定宽度文件的解析问题
问题汇总
我现在处理的是遗留软件生成的文件,它同时是不规则右对齐(ragged right)+固定宽度格式,碰到几个棘手问题:
- 最后一行缺了2个字符的分隔符,就算忽略对应列,用固定宽度模式解析还是会跳过最后一条记录
- 原本想用
F当分隔符,但记录里的名称偶尔会有字母F,导致拆分错误 - 测试发现
F 01D能唯一区分记录(每条记录开头都是01D),但Visual Studio不认带空格的分隔符,试了F\ 01D转义和F0x2001D十六进制写法都没用 - 另一个思路是把标题分隔符设成
2õ加16个空格,这样F分隔符会在左侧,最后一行的字符数也够,但不管是直接复制粘贴,还是转义、十六进制写法,系统都提示找不到这个分隔符 - 还有个怪事:把行分隔符设成
F时,只有文件29000字符处的一处(注释里的USE ALL OF THE AVAILABLE SUPPLY里的F)能被识别,后面所有的F都没反应
可行解决方案
1. 预处理补全最后一行
既然最后一行只是缺2个字符的分隔符,写个简单脚本就能搞定,比如用Python:
# 读取原文件 with open("legacy_data.txt", "r", encoding="utf-8") as f: content = f.read() # 拆分所有行,补全最后一行的缺失字符 lines = content.splitlines() if lines: # 假设缺的是2个空格或对应分隔符,根据实际情况调整 lines[-1] = lines[-1].ljust(len(lines[0])) if len(lines) >1 else lines[-1] + " " # 写入处理后的文件 with open("fixed_legacy_data.txt", "w", encoding="utf-8") as f: f.write("\n".join(lines))
处理完再用固定宽度模式解析,就能避免最后一条记录被跳过。
2. 用正则表达式精准拆分
别死磕VS内置的分隔符识别,改用正则匹配记录边界更靠谱。因为每条记录开头是01D,且前面是F ,直接用正则(?<=F )01D作为记录的起始标记:
- 在VS的文本处理工具或者自定义解析逻辑里,用这个正则匹配所有记录的起始位置,批量拆分
- 记录内容里的单独
F因为前面没有空格,不会触发匹配,完全不用担心误拆分
3. 解决特殊标题分隔符的编码问题
如果2õ加16个空格的方案逻辑可行但识别失败,大概率是编码不匹配:
- 先查清楚文件的编码格式(比如ANSI、UTF-8、GBK)
- 手动输入分隔符时,确保输入的字符编码和文件一致,别直接复制粘贴(避免剪贴板自动转码)
- 用十六进制编辑器查看这个分隔符的实际字节序列,在解析工具里直接按字节码设置分隔符
4. 排查F 仅识别一处的异常
这种情况基本是因为后面的F 里的空格不是普通空格:
- 用十六进制编辑器对比能识别和不能识别的
F,看空格的ASCII码是0x20(普通空格)还是0xA0(非断行空格) - 如果是特殊空格,先把文件里的特殊空格统一替换成普通空格,再用
F做分隔符;或者直接把对应字节码加到分隔符设置里
内容的提问来源于stack exchange,提问作者babno
相关产品推荐
相关产品推荐

