好的,使用ADO从CSV文件中提取Zip代码时遇到问题。发生的事情是,如果第一组邮政编码长度为5位,则数据类型将被指定为记录集中整个字段属性的整数,如果以下邮政编码不是9位数字邮箱则不会有问题破折号码(99999 vs 99999-9999)。遇到这9位数的邮政编码时,该字段产生空值。那么,我只能假设JET 4采用了一小部分数据样本(前3个记录?)并将数据类型分配给该字段。我曾尝试在运行时设置字段类型,但也失败了,因为我不知道我在做什么或者我无法控制它。
值得注意的几点: 1.我控制了拉取信息的SQL语句(使用group by子句) 在拉入数据之前,我的控制有限。 3.使用ADO的运行时语言VB6。
有任何建议或指示吗?
答案 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位数,带有 - , 应该被强制转换成字符串。