该脚本的目的是采用以换行符分隔的文本文件。可能填充重复的条目,并输出它删除所有重复项。
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
strPathToTextFile = "C:\Scripts\"
strFile = "Test.txt"
strOutputFile = "C:\this_is_the_output_changeme.txt"
Dim objFSO, objFile
Set objFSO = CreateObject("Scripting.FileSystemObject")
set objFile = objFSO.CreateTextFile(strOutputFile)
sql = "Select DISTINCT * FROM " & strFile
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & strPathtoTextFile & ";" & _
"Extended Properties=""text;HDR=NO;FMT=Delimited"""
objRecordSet.Open sql, objConnection
Do Until objRecordSet.EOF
objFile.Write(objRecordSet.Fields.Item(0).Value)
objFile.Write(vbCrLf)
objRecordSet.MoveNext
Loop
objFile.Close
看起来很稳固吧?它工作正常....取决于输入文件。所以这就是问题所在,有时它就像一个魅力,有时它会混淆并报告所有非数字条目作为单个不同的空。
以下两个示例输入正常工作:
0
1
1
2
3
4
5
3
5
6
7
8
9
9
9
将输出:
0
1
2
3
4
5
6
7
8
9
此输入
gray
grey
gray
graey
greay
grey
gray
greasy
greay
输出:
graey
gray
greasy
greay
grey
但是很多其他输入导致此特定脚本因类型不匹配错误而崩溃。如果我用Wscript.echo换掉objFile.Write,我可以看到objRecordSet返回空值。
重新创建此错误的最简单输入是:
1
1
a
a
如果我回应这个输入,我得到:
null
1
基本上,字母和数字的任何组合都会产生此错误。所有字母都以单个null的形式返回,数字很好。
这对我来说似乎很奇怪。似乎RecordSet得出结论,如果有一些数字值,它只会接收数字值,并将所有字母抛出为空数字。据我所知,在任何输入中都会出现此错误,其中数字条目的数量是字母条目数量的一半
我无法确定指定将所有返回的项目作为字符串接收的方法。我该如何解决这个问题?
答案 0 :(得分:1)
问题是由于(一个且唯一的)列的数据类型的驱动程序引起的。通过将schema.ini文件放在数据源文件夹中来帮助驱动程序。
我的schema.ini用于此演示:
[numbers.txt]
Format=TabDelimited
ColNameHeader=False
Col1=F1 FLOAT
[texts.txt]
Format=TabDelimited
ColNameHeader=False
Col1=F1 TEXT
[mixed.txt]
Format=TabDelimited
ColNameHeader=False
Col1=F1 TEXT
演示代码:
Const adClipString = 2
Dim oCN : Set oCN = CreateObject("ADODB.Connection")
Dim sTDir : sTDir = goFS.GetAbsolutePathName("..\data")
Dim aTables : aTables = Array("numbers.txt", "texts.txt", "mixed.txt")
oCN.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & sTDir & ";" & _
"Extended Properties=""text;HDR=NO;FMT=TabDelimited"""
Dim sTable
For Each sTable In aTables
Dim sFSpec : sFSpec = goFS.BuildPath(sTDir, sTable)
WScript.Echo " In:", Replace(goFS.OpenTextFile(sFSpec).ReadAll(), vbCrLf, " ")
WScript.Echo "Seen:", oCN.Execute("SELECT * FROM [" & sTable & "]").GetString(adClipString, , "", " ", "NULL")
WScript.Echo " Out:", oCN.Execute("SELECT DISTINCT * FROM [" & sTable & "]").GetString(adClipString, , "", " ", "NULL")
Next
oCN.Close
QED输出:
Unique00 - unique via ADO Text Driver
=================================================
In: 2,05 2 1 2,5 3 2,05 2
Seen: 2,05 2 1 2,5 3 2,05 2
Out: 1 2 2,05 2,5 3
In: grey gray gray
Seen: grey gray gray
Out: gray grey
In: 1000 grey 10 gray 9 gray 9 1 gray
Seen: 1000 grey 10 gray 9 gray 9 1 gray
Out: 1 10 1000 9 gray grey
=================================================
xpl.vbs: Erfolgreich beendet. (0) [0.67188 secs]