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
相关产品推荐
相关产品推荐

