ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 10172|回复: 3

用ADO读取CSV文件产生的数据丢失的问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2007-9-18 11:56 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
       在VBA里想通过ADO将CSV文件中的数据读取到EXCEL工作簿中,其中有一列的数据是一些数值和文本的混合体,将这列数据读取到EXCEL的时候,ADO就会把不是同一类型的数据剔除掉,从而产生数据丢失的问题,有什么办法在不打开这个CSV文件的基础上,利用ADO就能完整导入这些数据呢?

TA的精华主题

TA的得分主题

发表于 2007-10-3 08:36 | 显示全部楼层
使用强制转换命令就不会丢了。最好把文件附上,便于解决问题。

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-11-7 01:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

在网上找啊找,终于找到一个同样问题的解答,按照最后的注册表设置,问题总算是解决了。

网文如下:

连接字符串:

(1)ODBC:connstr="Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=d:\data\;Extensions=asc,csv,tab,txt;"

(2)OLEDB:connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\;Extended Properties=""text;HDR=Yes;FMT=Delimited"""

注意:
<1>路径,即dbq或data source,只到目录一级,不指定文件名(在sql语句中指定)

<2>HDR=YES,表示数据的第一行作为表的标题行,也就是列名,可以用这些列名来筛选数据,进行关联什么的。

如果HDR=NO,则表示第一行开始就是数据了,那么列名自动的就是F1,F2,F3…………

可以用rs("F1"),rs("F2")等来引用,也可以在sql中用它们来筛选数据等等。

<3>FMT=Delimited,表示用默认的分隔符,而通常默认的分隔符就是逗号了。

这个默认值在注册表的

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text\Format

位置下,默认是CSVDelimited,可以修改成Delimited(;)或Delimited(|)等等。

<4>如果某个列没有值,也就是直接两个逗号,中间什么都没有,那么对应的值是NULL,注意判断。

<5>关于数据类型的判定。
OLE DB驱动是根据数据的值来推断数据类型的……所以有时就推断的不对了。

以下是摘录:

Jet 和 ODBC 提供程序将返回占多数的类型的数据,但对于占少数的数据类型,则会返回 NULL(空)值。如果该列中两种类型数据的数量相等,提供程序将优先选择数字型数据,放弃文本型数据。

例如: 
• 在被扫描的八 (8) 行中,如果该列包含五 (5) 个数字值和三 (3) 个文本值,则提供程序将返回五 (5) 个数字和三 (3) 个空值。 
• 在被扫描的八 (8) 行中,如果该列包含三 (3) 个数字值和五 (5) 个文本值,则提供程序将返回三 (3) 个空值和五 (5) 个文本值。 
• 在被扫描的八 (8) 行中,如果该列包含四 (4) 个数字值和四 (4) 个文本值,则提供程序将返回四 (4) 个数字和四 (4) 个空值。 

作为解决只读数据问题的一种替代方法,可在连接字符串的“扩展属性”部分中使用“IMEX=1”这一设置来启用导入模式。这可强制执行 ImportMixedTypes=Text 注册表设置。但在此模式下,执行更新操作时可能会出现意外的结果。


注意,连接串里有IMEX=1,还不够,还得修改注册表,将ImportMixedTypes设置为Text才行。(我没试出来,加上还是不行哦,怪。)

注册表位置同上。

[此贴子已经被作者于2007-11-8 23:23:40编辑过]

TA的精华主题

TA的得分主题

发表于 2013-10-7 17:49 | 显示全部楼层
找了一天終於解決我的問題!謝謝excel home論壇
不過要修正一下

註冊表分32與64位元

附上我成功修改的畫面

32.gif

64.gif
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-9-30 14:50 , Processed in 0.043910 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表