在CSV文件中读取问题。 +和 - 字符读为0

时间:2015-10-14 13:16:43

标签: excel excel-vba csv oledb vba

我遇到一个相当奇怪的问题,即使用Microsoft.ACE.OLEDB.12.0引擎读取一个小的csv文件。

    Dim cN As ADODB.Connection
    Dim RS As ADODB.Recordset
    Set cN = New ADODB.Connection
    Set RS = New ADODB.Recordset
    cN.Open ("Provider=Microsoft.ACE.OLEDB.12.0;" & _
               "Data Source=" & myPath & ";" & _
               "Extended Properties=""Text;HDR=NO;FMT=CSVDelimited""")
    RS.ActiveConnection = cN
   RS.Source = "select * from " & myfile
   RS.Open

当呼叫RS.Fields(7)时应该是" +"或者" - "它返回的值为0?

我无法控制所提供的csv文件,所以我不能拥有" +"或" - "字符改为其他东西。

2 个答案:

答案 0 :(得分:2)

ACE是一种拥有这种东西的野兽。与将字段类型作为其元数据的一部分的普通数据库不同,CSV只是数据。因此,ACE必须对数据类型做出决定。在您的情况下,ACE决定这是一个数字,因为它以+-开头。如果我没记错的话,ACE和它的JET前身只分析前8个记录来确定字段类型。

虽然有两种解决方法。

  1. 您可以使用schema.ini文件。基本上这是一个名为schema.ini的文本文件,您只需将其保存在与所连接数据相同的文件夹中。如果文件存在,ACE将自动使用该文件。 Here's some info about how to build it(您可以谷歌并获得大量示例)。

  2. 这是创可贴的方法,有时比schema.ini更容易,具体取决于您的具体情况。由于ACE仅分析CSV的前8个记录以确定字段类型,因此您只需在文件顶部插入8个具有确定字段类型的新记录。例如,包含+-的字段只会粘贴S之类的字符。然后,ACE将看到这是一个非数字字段,并将其视为字符串。 You can see here how to prepend data to an existing text file using the filesystemobject(和谷歌了解更多信息,这是非常有用的东西)

答案 1 :(得分:1)

+/-正在强制进行数值转换,而你正在丢失符号,而不是纯粹的数学等价,在两种情况下都是零。

您可以尝试使用详细说明字段类型的相应Schema.ini。如果无法做到这一点,请放弃ADODB.Connection并使用Workbooks.OpenText method。将该列的xlColumnDataType指定为xlTextFormat(例如 2 )。