You need to enable JavaScript to run this app. VB.NET使用OleDb将CSV解析为DataTable时浮点值被误转为日期问题
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET使用OleDb将CSV解析为DataTable时浮点值被误转为日期问题

OleDb导入CSV时浮点数被误识别为日期的修正方案

核心问题根源

OleDb的Text驱动默认会采样CSV前8行的内容自动推断列类型,遇到用逗号做小数分隔符的浮点值(如2,08、0,82)时,会错把这类格式匹配为小时/分钟格式,自动转换为以1899年12月30日为基准的时间序列值。现有配置没有关闭自动推断、也没有手动指定列类型,因此触发误识别。

第一步:补全schema.ini配置

当前schema.ini仅指定了分隔符,缺少强制类型定义的关键配置,修正后的完整文件内容为:

[anar_adm.csv]
Format=Delimited(;)
# 声明第一行为表头,匹配连接串的HDR=YES配置
ColNameHeader=True
# 核心配置:设为0将完全禁止OleDb自动采样推断列类型
MaxScanRows=0
# 逐列手动定义类型,替换为CSV内实际的列名
# 浮点数列强制指定为Double类型,阻断日期识别逻辑
Col1=第一列的表头名 Char Width 255
Col2=浮点值所在列的表头名 Double
Col3=其他列的表头名 对应类型声明
# 匹配CSV内用逗号作为小数分隔符的格式
DecimalSymbol=,

关键配置说明:

  • MaxScanRows=0:是关闭自动格式化逻辑的核心开关,参数设为0后OleDb不会对前N行内容做采样,完全按照手动定义的列类型读取数据,不存在自动识别的过程
  • 直接给浮点数列指定Double类型,从规则层面排除该列被识别为日期/时间的可能
  • DecimalSymbol=,:让OleDb正确识别逗号格式的浮点数,避免数值解析错误

第二步:修正OleDb连接串错误

当前连接串存在两处配置问题:

  • Delimited分隔符配置多了一个冗余的右括号
  • Data Source需要填写CSV文件所在的文件夹绝对路径,而非CSV文件本身的完整路径(Text驱动会把指定文件夹作为整个数据库目录)
    修正后的连接串代码:
Dim csvFolderPath As String = IO.Path.GetDirectoryName(csvFilePath)
Dim con As New OleDbConnection(
    "Provider=Microsoft.ACE.OLEDB.12.0;" &
    "Data Source=" & csvFolderPath & ";" &
    "Extended Properties=""text;HDR=YES;FMT=Delimited(;)"""
)

可选兜底方案

如果手动配置schema仍存在偶发识别异常,可以采用更稳妥的规避逻辑:

  • 在schema.ini中将所有列临时定义为Char Width 1024类型,强制所有值以字符串形式读取
  • 在代码侧自行转换值格式:将字符串中的逗号替换为点后,再调用Double.Parse转成目标数值类型,完全跳过OleDb的自动格式转换流程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.09 19:45:05