0

Stack Overflow、私はこの問題について午前中吹き飛ばしました。私はスクリプトで同僚を助けようとしています。彼はプログラマーではありません。インターネットからコードをコピーして、希望する結果が得られるようにコードを変更するように依頼しました。私はそれを熟読し、不要な部分をすべて廃棄して書き直したので、私が理解できる方法でやりたいことができました。私は正直に言うと、同僚が修正が必要なVBscriptを持っている場合、これらのコンテキストでのみ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

かなりしっかりしているようですね。入力ファイルによっては正常に動作します。したがって、ここに問題があります。それは魅力のように機能することもあれば、混乱して、すべての非数値エントリを単一の別個のnullとして報告することもあります。

正常に機能する2つの入力例を次に示します。

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

ただし、他の多くの入力により、この特定のスクリプトがTypeMismatchエラーでクラッシュします。objFile.WriteをWscript.echoと交換すると、objRecordSetがnullを返していることがわかります。

このエラーを再現するための最も簡単な入力は次のとおりです。

1
1
a
a

この入力をエコーアウトすると、次のようになります。

null
1

基本的に、文字と数字の任意の組み合わせでこのエラーが発生します。すべての文字が単一のnullとして返され、数字は正常に出力されます。

これは私には非常に奇妙な行動のように思えます。RecordSetは、いくつかの数値がある場合にのみ数値を受け取ると結論付け、すべての文字をnull数値として破棄するように見えます。私の知る限り、文字のエントリの半分の数のエントリがある入力では、このエラーが発生します。

返されたすべてのアイテムを文字列として受け取るように指定する方法を決定できませんでした。この問題の解決策をどのように追求する必要がありますか?

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 に答える