ADO拉取CSV的数据类型问题

时间:2011-04-29 19:46:14

标签: sql csv types ado

好的,使用ADO从CSV文件中提取Zip代码时遇到问题。发生的事情是,如果第一组邮政编码长度为5位,则数据类型将被指定为记录集中整个字段属性的整数,如果以下邮政编码不是9位数字邮箱则不会有问题破折号码(99999 vs 99999-9999)。遇到这9位数的邮政编码时,该字段产生空值。那么,我只能假设JET 4采用了一小部分数据样本(前3个记录?)并将数据类型分配给该字段。我曾尝试在运行时设置字段类型,但也失败了,因为我不知道我在做什么或者我无法控制它。

值得注意的几点: 1.我控制了拉取信息的SQL语句(使用group by子句) 在拉入数据之前,我的控制有限。 3.使用ADO的运行时语言VB6。

有任何建议或指示吗?

2 个答案:

答案 0 :(得分:1)

执行此操作的常见方法似乎是使用Schema.ini file

  

使用Text驱动程序时,   确定文本文件的格式   通过使用架构信息文件。   架构信息文件始终是   名为Schema.ini并始终保留   与文本数据相同的目录   资源。架构信息文件   为IISAM提供信息   关于文件的一般格式,   列名和数据类型   信息和其他一些数据   特点。 Schema.ini文件是   始终需要访问   定长数据。你应该用一个   Schema.ini文件时你的文本表   包含DateTime,Currency或   十进制数据,或者您的任何时间   想要更多地控制处理   表中的数据。

我使用以下文件设置了一个示例:

<强> test.csv

normal text,12345
some more ordinary words,12345-9876

<强>的Schema.ini

[test.csv]
Format=CSVDelimited
ColNameHeader=False
Col1=Dummy Text
Col2=ZipCode Text

<强> test.vbs

Option Explicit

Dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
Dim oConn : Set oConn = CreateObject("ADODB.Connection")
Dim rs : Set rs = CreateObject("ADODB.Recordset")

Dim scriptPath : scriptPath = fso.GetParentFolderName(WScript.ScriptFullName)

oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & scriptPath & ";" & _
           "Extended Properties=""text;HDR=NO"""

rs.Open "SELECT * FROM test.csv", oConn

WScript.Echo rs.Fields(0).Name & "|" & rs.Fields(1).Name

Do Until rs.EOF
    WScript.Echo rs.Fields(0).Value & "|" & rs.Fields(1).Value
    rs.MoveNext
Loop

rs.Close
oConn.Close

输出如下:

Dummy|ZipCode
normal text|12345
some more ordinary words|12345-9876

请记住,Schema.ini文件必须与文本文件位于同一文件夹中,并且必须按名称引用文本文件(上例中为[test.csv])。您可能必须为导入的每个文件动态生成Schema.ini文件,或者将csv文件复制并重命名为临时位置。

答案 1 :(得分:0)

是的,ADO根据第一条记录输入强制。 Dash' - '是整数类型中的无效字符,因此它不会解析它们。你希望整个东西都是一个字符串(真的,你做的 - 邮政编码是字符串,而不是整数)。

预先分析数据可能是值得的。编写一个小程序来读取CSV并将-0000添加到5位数记录中。然后所有记录都是10位数,带有 - , 应该被强制转换成字符串。