使用ADO导入混合数据类型时遭遇数据类型识别异常问题
解决ADO读取大CSV时因TypeGuessRows导致的字段类型推断问题
这个坑我太熟了!之前帮同事排查过好几次——ADO处理CSV的自动类型推断机制,在你这种“某列绝大多数是0,只有几百行是小数”的场景下,绝对会掉链子。
问题到底出在哪?
ADO默认会读取注册表中TypeGuessRows配置的行数(默认一般是8行)来判断字段类型。你的目标列前N行全是0,ADO直接就把它判定成整数类型了,后面出现的0.05、0.03这类小数要么被截断成0,要么直接读成NULL,直接导致整个读取流程炸锅。
靠谱的解决方案,按优先级排:
1. 用Schema.ini文件(针对单个CSV,最推荐)
不想改全局设置的话,给你的CSV配个Schema.ini是最稳妥的——它能强制指定单个文件的字段类型,完全绕过ADO的自动推断。
操作步骤很简单:
- 在你的CSV所在文件夹里新建一个叫
Schema.ini的文本文件 - 照着下面的格式写(替换成你的实际文件名和列信息):
[你的CSV文件名.csv] ColNameHeader=True ; 如果你的CSV有表头就设为True,没有就False Format=CSVDelimited ; 按顺序列出所有列,重点把出问题的列指定为Double类型 Col1=列1名称 Text Col2=列2名称 Integer ... ColX=出问题的列名 Double ; 这里直接锁死双精度小数类型
- 确保列的数量、顺序和CSV完全对应,这样ADO就会严格按照你指定的类型读取每一列。
2. 修改注册表的TypeGuessRows(全局生效)
如果你愿意让所有使用Jet引擎读文本文件的程序都用“全文件扫描”来推断类型,可以改注册表:
- 32位系统路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text - 64位系统路径:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Jet\4.0\Engines\Text - 找到
TypeGuessRows,把它的值改成0——这会让ADO扫描整个CSV文件来确定字段类型,而不是只看前N行。 - 注意:这个修改是全局的,会影响所有用Jet引擎读文本的程序,谨慎操作。
3. 在连接字符串里指定TypeGuessRows(仅当前连接生效)
有些ADO版本支持在连接字符串里直接设置这个参数,不用改注册表:
Dim conn As New ADODB.Connection conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\你的CSV所在文件夹\;Extended Properties='text;HDR=Yes;TypeGuessRows=0;'"
这里的TypeGuessRows=0和注册表修改效果一样,但只对当前这个数据库连接生效,不会影响其他程序。
小提示
- 如果你的CSV是UTF-8编码,记得在Schema.ini或者连接字符串里加上
CharacterSet=65001,避免乱码。 - 测试的时候可以先截一段包含小数的CSV来验证方案,别直接拿13万行的大文件试,省时间。
内容的提问来源于stack exchange,提问作者mediaeval
相关产品推荐
相关产品推荐

