Excel VBA读取二进制FrameMaker文件内容异常问题求助
解决FrameMaker二进制文件读取内容不稳定的问题
嘿,我来帮你搞定这个问题!你遇到的每次运行脚本,fileString里的内容都不一样的情况,根源其实很明确:FrameMaker的*.fm文件是二进制格式,不是纯文本文件。直接用VBA里普通的文本读取方式(比如Open ... For Input)会把二进制字节错误地解析成文本,而文件里的非文本字节(比如控制字符、专属二进制标记)会被系统乱解释,甚至触发不确定的编码转换,自然每次读出来的内容都不一样了。
给你一套靠谱的解决方案,用二进制模式读取文件,先拿到原始字节数据,再转成稳定的文本:
正确的VBA读取代码
Sub ReadFMFileBinary() Dim filePath As String Dim fileNum As Integer Dim byteData() As Byte Dim fileString As String Dim startLine As Integer, endLine As Integer ' 替换成你的FM文件路径 filePath = "C:\YourTargetFile.fm" fileNum = FreeFile() ' 以二进制模式打开,确保拿到原始字节 Open filePath For Binary Access Read As #fileNum ReDim byteData(LOF(fileNum) - 1) Get #fileNum, , byteData Close #fileNum ' 转换为字符串:FM文件通常用UTF-16编码,用vbUnicode适配 fileString = StrConv(byteData, vbUnicode) ' 分割并提取前25行(注意FM的换行符一般是vbCrLf) Dim lines() As String lines = Split(fileString, vbCrLf) endLine = IIf(UBound(lines) < 25, UBound(lines), 24) ' 数组从0开始,前25行对应索引0-24 Dim first25Lines As String first25Lines = "" For startLine = 0 To endLine first25Lines = first25Lines & lines(startLine) & vbCrLf Next startLine ' 现在first25Lines就是稳定的内容,放心用正则处理吧 Debug.Print first25Lines End Sub
额外注意事项
- 编码适配:如果转成字符串后还有乱码,可以试试用
StrConv(byteData, vbUTF8),或者用ADODB.Stream来指定编码读取,比如:Dim stream As Object Set stream = CreateObject("ADODB.Stream") stream.Type = 1 ' 二进制模式 stream.Open stream.LoadFromFile filePath stream.Type = 2 ' 文本模式 stream.Charset = "UTF-16LE" ' 指定编码 fileString = stream.ReadText stream.Close - 跳过二进制签名:FM文件开头可能有一段二进制签名,你可以在转换为字符串后,先定位到实际文本内容的起始位置(比如找第一个出现的版本号相关关键词),再进行后续处理。
- 正则稳定性:现在读取到的是准确的文本内容,你的正则表达式就能稳定匹配版本、修订日期这些信息了,不会再因为内容乱变而失效。
内容的提问来源于stack exchange,提问作者gwc
相关产品推荐
相关产品推荐

