Name,Department,Title
Ken Myer,Finance,Fiscal Specialist
Pilar Ackerman,Research,Manager
Jonathan Haas,Headquarters,Fiscal Specialist
若想要有所有 Fiscal Specialist (會計師) 的名單,可以使用與此相似的 ADO 指令碼來擷取該項資訊,而不用一行一行地讀過整份文字檔案。
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H0001
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
strPathtoTextFile = "C:\Scripts\Text files"
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & strPathtoTextFile & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""
strFile = "Employees.txt"
objRecordset.Open "SELECT * FROM " & strFile & " WHERE Title = 'Fiscal Specialist'", _
objConnection, adOpenStatic, adLockOptimistic, adCmdText
Do Until objRecordset.EOF
Wscript.Echo objRecordset.Fields.Item("Name")
Wscript.Echo objRecordset.Fields.Item("Department")
Wscript.Echo objRecordset.Fields.Item("Title")
objRecordset.MoveNext
Loop
我們在這裡所做的,是連接到 C:\Scripts\Text files 資料夾,然後查詢 Employees.txt 檔案。這一行程式碼指出我們想要處理的檔案名稱:
strFile = "Employees.txt"
看起來完美無缺:指令碼會執行,而且會回報所有會計師的名稱、部門和職稱。
那問題在哪裡?假設我們的文字檔案叫做 Fabrikam Employees.txt。沒什麼大不了的,對吧?畢竟,您只需要將 strFile 變數的值改成這樣就可以了:
strFile = "Fabrikam Employees.txt"
我們也是這樣想,可是執行指令碼後卻得到這個訊息:
Microsoft JET Database Engine: Syntax error in FROM clause.
哎呀!顯然 Fabrikam Employees.txt 檔名中的空格造成了問題,這我們知道,我們想不透的是要怎麼解決這個問題。我們試過各種不同的單引號與雙引號排列組合,卻發現答案其實簡單多了:只要把檔名用方括弧括起來就解決了。
沒錯,方括弧。如果將 strFile 的值設成這樣,指令碼就會運作順暢:
strFile = "[Fabrikam Employees.txt]"
老實說,這實在有點令人失望。在經過一番大費周章,我們以為答案應該是很複雜;那樣我們才有理由說:「我們之所以花了這麼長的時間,是因為這是一個相當複雜的問題,需要無比的理智推論與能力,才找得出答案。」結果我們只能說:「只要用方括號將檔名括起來就行了!」哎,至少可以用就好了!反正就像我們說的,我們連在愛因斯坦跟牛頓的大作中都找不到答案,所以囉。
對了,完整的指令碼看起來像這樣:
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H0001
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
strPathtoTextFile = "C:\Scripts\Text files"
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & strPathtoTextFile & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""
strFile = "[Fabrikam Employees.txt]"
objRecordset.Open "SELECT * FROM " & strFile & " WHERE Title = 'Fiscal Specialist'", _
objConnection, adOpenStatic, adLockOptimistic, adCmdText
Do Until objRecordset.EOF
Wscript.Echo objRecordset.Fields.Item("Name")
Wscript.Echo objRecordset.Fields.Item("Department")
Wscript.Echo objRecordset.Fields.Item("Title")
objRecordset.MoveNext
Loop
外加一筆。諷刺的是,在那麼努力嘗試找出一種方式來存取檔名中有空格的文字檔案之後,我們最後卻找到了兩種辦法。您也可以用 ` 字元來括住檔案名稱,這不是單引號,而是與 ~ 符號位在同個鍵 (至少在美式英文鍵盤上是一樣的) 上的重音符號。換句話說,您也可以將 strFile 的值設為以下名稱,指令碼照樣可以正常運作:
strFile = "`Fabrikam Employees.txt`"
|