Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 在CSV文件中读取问题。+和-读取为0的字符_Excel_Csv_Oledb_Vba - Fatal编程技术网

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

Excel 在CSV文件中读取问题。+和-读取为0的字符,excel,csv,oledb,vba,Excel,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;" & _

我遇到了一个相当奇怪的问题,即使用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.Fields7时,哪个应为+或a-返回的值为0


我无法控制给定的csv文件,因此我无法将+或-字符更改为其他字符。

ACE是一个处理此类内容的野兽。与将字段类型作为元数据一部分的普通数据库不同,CSV只是数据。因此,ACE必须决定数据类型。在您的情况下,ACE决定这是一个数字,因为它以+或-开头。如果我没记错的话,ACE和它的JET Preceptor只分析前8条记录来确定字段类型

但有两种方法可以解决这个问题

您可以使用schema.ini文件。基本上,这是一个名为schema.ini的文本文件,您只需将其与所连接的数据放在同一文件夹中即可。如果文件存在,ACE将自动使用该文件。你可以在谷歌上搜索,得到大量的例子

这是创可贴方法,它有时比StudioIi更容易,取决于您的情况。由于ACE仅分析CSV的前8条记录以确定字段类型,因此您可以在文件顶部插入8条具有确定字段类型的新记录。例如,您的字段包含+或-仅粘贴一个字符,如S.ACE,则会看到这是一个非数字字段,并将其视为字符串。谷歌提供更多信息,这是非常有用的东西


+/-强制进行数字转换,您将失去符号,转而使用其纯数学等价物,在这两种情况下均为零


您可以尝试使用适当的方法来详细说明字段类型。如果不可能,请放弃ADODB.Connection并使用。将该列指定为xlTextFormat,例如2。

是的,我知道创建schema.ini文件会起作用,但我有大约53个csv文件要运行,根据我收集的信息,您不能在架构文件中使用通配符。我想我会创建一个默认的schema.ini,并在运行所有csv文件时更改文件名。我相信@jeeped建议使用Workbooks.OpenText可能不是一个坏方法。你可以把这些东西一个一个打开,然后抓取它们的值。唯一需要注意的是,如果您正在执行比“选择*自”更复杂的操作。另一种选择,又是一种创可贴,将使用FielSisteObjor将每个CSV移动到分离的文件夹中,快速重写Studio.In文件并将其移动到该文件夹,然后运行导入。您必须以编程方式编写schema.ini,但无论如何,它对于excel和VBA都可以很好地扩展。