首页 > 解决方案 > Microsoft ACE 文本驱动程序将数字转换为日期

问题描述

我正在尝试在 Excel 中处理巨大的 CSV(~165 MB,~500K 行)并决定使用 ACE Text Driver。我已经知道我需要在程序文件旁边创建特殊的 section.ini文件。到目前为止,一切都很好。说,我有以下 CSV:

ID;VAL1
JSNT;6,00

Section.ini文件:

[测试.csv]
格式=分隔(;)
ColNameHeader=真

VBA代码:

Sub GetEntries()

    Dim file_path$, conn_string$, sql$
    Dim rs As ADODB.Recordset
    
    conn_string = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                  "Data Source=" & ThisWorkbook.Path & "\;" & _
                  "Extended Properties=Text;"
    sql = "SELECT * FROM [test.csv];"
    
    Set rs = New ADODB.Recordset
    rs.CursorLocation = adUseClient
    rs.Open sql, conn_string, adOpenForwardOnly, adLockReadOnly, adCmdText
    wksOutput.Range("A1").CopyFromRecordset rs

End Sub

此代码有效,但请看一下结果: AceTextDriverConvertsNumberToDate

换句话说,文本驱动程序将数字转换为日期!我认为这与 Excel 的转换曲折有关,但我确定原因是文本驱动程序。一切都很简单——我刚刚检查Type了这个字段的属性——它是adDate(7)。因此,Excel 与它无关。但是关于section.ini的页面说我可以手动设置字段类型,所以我在section.ini中添加了这一行:

Col2=VAL1 双精度

Col2表示第二个字段并且Double是该字段的类型。但是......它也无法正常工作!经过一些测试,我发现了以下内容。如果出现以下情况,该数字将转换为日期:

  1. 小数点前的数字在 0 到 23 之间(包括)
  2. 小数点后的数字在 00 到 59 之间(包括) 可以看到,数字6,00符合这个条件,所以它被转换为日期。

任何想法如何解决这个问题?还是我做错了什么?

更新

正如@shrivallabha.redij 所说,我可以将接收列的类型设置为文本。但这不是一个解决方案,因为我事先无法知道哪些列会以这种方式运行。

标签: excelvbacsvparsing

解决方案


推荐阅读