vbscript脚本用二进制方式读写文件

  在项目中遇到这样的问题,程序中需要将用 Adodb.Stream生成的utf-8格式的csv文件导入mysql数据库中,当使用load data infile命令导入数据库以后,导入的表中的第一行第一列的数据总是有一个问号,而导入前用文本编辑器打开看不出有什么问题,经过调查最后发现文件的开始处有三个字节不可见的字符,用ultraEdit的16进制编辑方式可以看到是EF BB BF三个字节(注意,一定要用版本高一点的ue才可以看到utf-8文件正确的格式,最初我用ue 10.2版本看到的一直是FFFE两个字节,被老版本的给迷惑了。后来用ue的14.2版本才可以看到正确的格式。),查了些资料才知道这是utf-8文件的bom信息,utf-8的文件分有bom和无bom的两种,Adodb.Stream生成的文件是有bom的,而在导入数据库时,这三个字符被当作普通字符插入表中,所以造成了不想要的错误结果。
    于是想办法解决这个问题,由于utf-8格式的文件,它的存储顺序与编码顺序是一致的,所以有bom和无bom格式的区别就是多了EF BB BF这三个字节,只要我们用二进制方式读取文件,跳过前三个字节就可以去掉这个bom了。要二进制方式操作文件,还是只能使用Adodb.Stream对象,写了个简单的测试例子如下:
Set stm = CreateObject("Adodb.Stream") stm.Type = 1 stm.Open stm.LoadFromFile "e:/tmp/apachelog.txt" stm.Position = 3 byteArr = stm.Read(-1) stm.Close stm.Open stm.Write byteArr stm.SaveToFile "e:/tmp/apachelog22.txt", 2 stm.Flush stm.Close
http://blog.csdn.net/zmxj/archive/2009/02/27/3943742.aspx
操作二进制文件时,要注意type属性一定要设为1,就是二进制方式,否则,read方法会出错。Position属性值设为3,就是不读取前三个字节,read方法返回的是字节数组,如果你想验证前三个字节的内容,可以先不用设置Position属性,打个断点,就可以看到数组中的内容,前三个字节EF BB BF的十进制值为239,187,191。例子中,apachelog22.txt为操作后的文件,可以用十六进制方式打开两个文件对比一下是否正确。

关于utf-8的bom,已经二进制文件操作可以参考:

http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

http://www.paulsadowski.com/WSH/getremotebinaryfile.htm

你可能感兴趣的:(vbscript脚本用二进制方式读写文件)