Excel VBA 编程基础 -- 文件处理性能比较
我们的《文件处理》系列讨论了传统的文件处理工具,用《现代文件处理》系列讨论了 FileSystemObject 的文件处理工具。一个很自然的问题就是:这两种文件处理方式各有什么优缺点?- 默认只能处理 ANSI 编码的文件,要处理 Unicode 编码的文件,需要手工通过代码实现。
现代文件处理工具(FileSystemObject 对象等):- 一般来说只能处理顺序文件,因为 Skip 只能向前跳跃,因此不能随机地访问文件内容。
- 既可以处理 ANSI 编码的文件,也可以处理 Unicode 编码的文件。
下面通过一个例子来对比一下传统文件处理工具和现代文件处理工具。这个例子读取如下图所示的 Excel 数据集,并写入文件:该数据集有 10 万条记录,我们的例子用来测试两种文件处理方式的写入效率。主控程序代码如图2所示。在上面的代码中,分别以传统和现代方式读取数据集并写入文件。传统方式写入的文件以 old_ 开头,根据写入字符的编码方式区别为 ascii 和 unicode。从右侧立即窗口显示的执行时间可以看出,传统方式的执行时间比较短,说明文件写入效率比较高,因为几种方式的唯一区别就是文件写入方式。先来看生成 old_ascii.txt 文件的代码:图3 所示的 OldFileForANSI 过程就是传统方式写入文件的最简形式,代码直接利用了 Write # 语句的写入功能,因此是几种方式中效率最高的。但 Write # 语句的写入方式并不一定能满足要求,因此有 OldFileForANSI2,如图4 所示:在 OldFileProcForANSI2 过程中,文件以二进制方式打开,写入时使用 Put # 语句。Put # 语句与 Write # 语句的区别是:Put # 严格按照所给内容写入文件,不进行转换。但如果写入内容是 Variant 类型的字符串,则先写入 4 字节内容(2 字节的 VarType 类型值,2 字节的字符串长度),然后再写入字符串内容。如果写入的内容是 String 类型的字符串,则 Put # 会直接写入字符串内容。为了使得生成的文件符合 CSV 的格式,必须手工对写入的内容进行传唤,包括字符串值要使用双引号括起来(因此要把原来字符串内容的双引号清除掉),数值型要转换为字符串类型,各个项之间以逗号分隔,等等。比较图4 和图5,可以看出,对于 Unicode 编码的文件,首先写入两字节的 BOM 标记(&HFFFE),表示这是一个 UTF-16LE 编码的文件。接下来的处理与 OldFileProcForANSI2 类似,唯一的不同就是,字符串在写入之前,要先使用 StrConv 函数转换为 Unicode 编码。以上是传统方式写入不同编码格式文件的各种处理方式。相比于传统方式,现代处理方式写入文件要简单得多,因为文件在打开时直接支持不同的编码格式。如图6 所示:只需要写一个 ObjectFileProc 过程即可支持不同的编码方式。从图7 可见,不管是传统的文件处理,还是现代的文件处理,生成的结果文件都是相同的。Unicode 的文件长度等于 ASCII 文件长度 * 2 + 2。最后这两字节是 BOM 标记。虽然两种文件处理方式的执行效率略有差别,但对于一般应用来说,这点差别可以忽略不计。FileSystemObject 提供的现代处理方式使得代码更为简单清晰,这更是我们所需要的。