0

Stack Overflow,我整个上午都在这个问题上搞砸了。我正在尝试用脚本帮助同事。他不是程序员,他只是从网上复制了一些代码,并让我修改它以获得他想要的结果。我仔细研究了它,废弃了所有不必要的部分并重写了它,所以它以我理解的方式做我想做的事。老实说,我只在这些情况下处理 VBscript,当同事有一个需要修复的时候。我在 VB6 中拥有我所有的 VB 经验。

该脚本的目的是获取一个以换行符分隔并可能填充重复条目的文本文件,并在删除所有重复项的情况下输出它。

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

基本上任何字母和数字的组合都会产生这个错误。所有字母都作为一个空值返回,并且数字很好。

这对我来说似乎是非常奇怪的行为。似乎 RecordSet 得出结论,如果有一些数字值,它只会接收数字值,并将所有字母作为空数字抛出。据我所知,在任何输入的数字条目是字母条目的一半的情况下,它都会遇到此错误

我一直无法确定一种方法来指定以字符串形式接收所有返回的项目。我应该如何寻求解决这个问题的方法?

4

1 回答 1

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]
于 2012-04-17T17:51:54.367 回答