You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OleDb读取CSV时混合字符串/数字列读取异常问题

问题:OleDb读取CSV时混合类型列数据丢失

我用OleDb读取CSV文件,代码如下:

Connection = new OleDbConnection(@"Provider = Microsoft.Jet.OleDb.4.0;" +
                                 @"Data Source='" + Path.GetDirectoryName(FileWork) + "';" +
                                 @"Extended Properties=""Text;HDR=YES;FMT=Delimited"""");

Connection.Open();
OriginTableName = "[" + Path.GetFileName(FileWork) + "]";
Adapter = new OleDbDataAdapter("SELECT * FROM " + OriginTableName, Connection);

CSV内容如下:

COL1,COL2,COL3,COL4,COL5
ABC,DEF,GHI,"57/8",125
ABC,DEF,GHI,801,587

遇到的问题:CSV中的"57/8"始终读成空字符串,但删掉第二行后就能正常读取。请问怎么读取包含混合字符串/数字的列?


解决方案
  • 修改连接字符串,添加IMEX=1参数
    这是最直接的解决方法,IMEX=1会强制OleDb将混合类型的列识别为文本类型,避免因类型推断导致数据丢失。修改后的连接字符串如下:

    Connection = new OleDbConnection(@"Provider = Microsoft.Jet.OleDb.4.0;" +
                                     @"Data Source='" + Path.GetDirectoryName(FileWork) + "';" +
                                     @"Extended Properties=""Text;HDR=YES;FMT=Delimited;IMEX=1"""");
    
  • 原理说明
    OleDb默认会扫描CSV的前8行数据来推断列的数据类型。你的CSV中第二行的COL4是数字801,它会把COL4判定为数字类型,导致带斜杠的"57/8"被当作无效数字处理,返回空值。IMEX=1开启导入模式,强制将混合类型列统一按文本读取,就能完整获取所有内容。

  • 极端情况处理(可选)
    如果CSV前8行大部分是数字,仅少数行是字符串,可能需要调整注册表中的TypeGuessRows值:

    1. 打开注册表编辑器,找到路径HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text
    2. 修改TypeGuessRows的值为0,表示扫描所有行来确定列类型
      注意:此操作会影响所有使用Jet引擎读取文本文件的程序,且大文件会降低读取性能,优先用IMEX=1解决即可。

内容的提问来源于stack exchange,提问作者Martin Dusek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:45:59