当前位置: 首页 > news >正文

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

相关文章:

  • 15个最佳Flash物理游戏
  • ARX 反回曲线上一定距离的点 函数
  • 2008主流数据库产品回顾与展望
  • ARX 沿着多段线绘制一定距离,递归执行
  • WinDBG 技巧: 显示GetLastError() 错误码 (!gle命令)
  • C# 窗体间传值总结
  • 诺基亚5800XM 承认质量缺陷
  • ASP.NET Web Application 中使用 Unity 依赖注入容器
  • ARX 多段线的合并
  • 参加ESB沙龙
  • 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
  • Unix哲学基础
  • C# EXCEL 导入导出类(OLEDB的方式)
  • 相声:我要谈恋爱
  • C# 操作EXCEL样式 示例 --生成EXCEL审计表
  • Android优雅地处理按钮重复点击
  • Facebook AccountKit 接入的坑点
  • JAVA_NIO系列——Channel和Buffer详解
  • jdbc就是这么简单
  • js递归,无限分级树形折叠菜单
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Mysql优化
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • React Native移动开发实战-3-实现页面间的数据传递
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Vue实战(四)登录/注册页的实现
  • 阿里研究院入选中国企业智库系统影响力榜
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 从0到1:PostCSS 插件开发最佳实践
  • 从零开始的无人驾驶 1
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 扑朔迷离的属性和特性【彻底弄清】
  • 强力优化Rancher k8s中国区的使用体验
  • 通信类
  • 我从编程教室毕业
  • 我感觉这是史上最牛的防sql注入方法类
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 湖北分布式智能数据采集方法有哪些?
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #Z2294. 打印树的直径
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $.ajax中的eval及dataType
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (搬运以学习)flask 上下文的实现
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (强烈推荐)移动端音视频从零到上手(下)
  • (三)mysql_MYSQL(三)
  • (一)RocketMQ初步认识
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包