我遇到一個相當奇怪的問題,它將使用Microsoft.ACE.OLEDB.12.0引擎讀取小型csv文件。當調用RS.Fields(7)應該是「+」或「 - 」時,它返回的值是0嗎?在CSV文件中讀取問題。 + and - 正在讀取的字符爲0
我無法控制給出的csv文件,所以我不能將「+」或「 - 」字符更改爲其他內容。
我遇到一個相當奇怪的問題,它將使用Microsoft.ACE.OLEDB.12.0引擎讀取小型csv文件。當調用RS.Fields(7)應該是「+」或「 - 」時,它返回的值是0嗎?在CSV文件中讀取問題。 + and - 正在讀取的字符爲0
我無法控制給出的csv文件,所以我不能將「+」或「 - 」字符更改爲其他內容。
ACE是一種有這種東西的野獸。與其字段類型作爲元數據一部分的普通數據庫不同,CSV只是數據。因此,ACE必須對數據類型做出決定。在你的情況下,ACE決定這是一個數字,因爲它從+
或-
開始。如果我沒有記錯,ACE和JET前輩只分析前8個記錄來確定字段類型。
雖然有兩種解決方法。
您可以使用schema.ini文件。基本上這是一個名爲schema.ini
的文本文件,您只需將其保存在與您要連接的數據相同的文件夾中即可。如果存在,ACE將自動使用該文件。 Here's some info about how to build it(你可以谷歌它並得到噸的例子)。
這是一種創可貼的方法,根據您的情況,這有時比schema.ini更容易。由於ACE僅分析CSV的前8個記錄以確定字段類型,因此只需在文件頂部插入8個具有明確字段類型的新記錄。例如,您的包含+
或-
的字段只能粘貼像S
這樣的字符。 ACE會看到這是一個非數字字段,並將其視爲一個字符串。 You can see here how to prepend data to an existing text file using the filesystemobject(和谷歌更多的信息,這是非常有用的東西)
的+/-迫使數字轉換,你正在失去支持其純粹的數學相當於其在兩種情況下是零的象徵。
您可以嘗試使用適當的Schema.ini來詳細說明字段類型。如果這是不可能的,放棄ADODB.Connection並使用Workbooks.OpenText method。將該列的xlColumnDataType指定爲xlTextFormat(例如,)。
是的我知道創建一個schema.ini文件是可行的,但我有大約53個csv文件可以運行,並且從我可以收集的內容中您不能在模式文件中使用通配符。我想我會創建一個默認的schema.ini,並在我運行所有csv文件時更改文件名。 –
我相信@jeeped使用'Workbooks.OpenText'的建議可能不是一個糟糕的路線。你可以將這些東西逐個打開並獲取值。唯一需要注意的是,如果你正在做一些比「SELECT * FROM'更復雜的事情。另一個替代方案,也是一種創可貼,將使用'filesystemobject'將每個csv移動到一個單獨的文件夾,快速重寫schema.ini文件並將其移動到該文件夾,然後運行導入。你將不得不以編程方式編寫schema.ini,但它會很好地擴展(很好地適用於Excel和VBA)。 –
JNevill