vbs中使用 ADO 讀取所有數(shù)據(jù)均在一行上的文本文件的代碼
更新時(shí)間:2007年03月28日 00:00:00 作者:
使用 ADO 讀取所有數(shù)據(jù)均在一行上的文本文件問:
您好,腳本專家!我有一個(gè)固定寬度的文本文件,該文件包含名字(6 個(gè)字符)、姓氏(13 個(gè)字符)和部門(9 個(gè)字符),并且它們均在同一行上。我該如何使用 ADO 來讀取呢?
-- DW
答:
您好,DW。坦白地講,我們認(rèn)為您不能使用 ADO(ActiveX 數(shù)據(jù)對象)讀取這樣的文件。ADO 是一種和文本文件進(jìn)行交互的非常好的方法(有關(guān)詳細(xì)信息,請參閱文章有關(guān)文本文件的 ADO 更多知識(shí)(英文)),但是,確實(shí),ADO 有些挑剔:它的每項(xiàng)設(shè)置都必須完全正確,否則就會(huì)拒絕工作。(不像腳本專家,即使所有事情都已準(zhǔn)備就緒,他們還是會(huì)拒絕工作。)作為一種數(shù)據(jù)庫技術(shù),ADO 需要一個(gè)“結(jié)構(gòu)良好”(借用 XML 領(lǐng)域的一個(gè)術(shù)語)的數(shù)據(jù)庫;它無法直接利用您那樣的文件格式并從中產(chǎn)生數(shù)據(jù)庫。(在這種情況下,可以將您的巨行分成若干單個(gè)記錄。)
但是沒關(guān)系;畢竟,我們可以使用雖古老但優(yōu)秀而可靠的 VBScript 來創(chuàng)建結(jié)構(gòu)良好的數(shù)據(jù)庫。我們今天要做的就是向您展示如何快速而便捷地將您的巨大數(shù)據(jù)字符串分割成單個(gè)記錄。只需通過將這些單個(gè)記錄(即,文本文件中的單個(gè)記錄)回顯到屏幕上我們就可以達(dá)到目的。不過,您可以將這些記錄段寫到另一個(gè)文本文件然后使用 ADO 從其中讀取數(shù)據(jù)。我們只是幫您開個(gè)頭,剩下的就要靠您自己了。
首先,我們假定您已擁有一個(gè)類似于下面的文本文件,該文件的字段名稱和兩條記錄包含于同一行之上:
First Last Dept Ken Meyer Finance Pilar Ackerman HR
我們希望最后的結(jié)果同下面的顯示更為相似:
First Last Dept
Ken Meyer Finance
Pilar Ackerman HR
這可能嗎?當(dāng)然可能:
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt", ForReading)
strContents = objFile.ReadAll
objFile.Close
i = False
Do Until i = True
intLength = Len(strContents)
If intLength < 28 Then
Exit Do
End If
strLines = strLines & Left(strContents, 28) & vbCrLf
strContents = Right(strContents, intLength - 28)
Loop
Wscript.Echo strLines
首先定義名為 ForReading 的常量并將其值設(shè)置為 1;我們將使用它打開要讀入的文本文件。
注意:您知道您的母親為何一直告訴您要帶上帽兜或者在穿過街道的時(shí)候朝兩邊看嗎?是的,我們腳本專家也一直告訴您在沒有指定要打開的文本文件的方式的情況下是無法將其打開的:是讀取、寫入還是添加。一次只能執(zhí)行一項(xiàng)操作:無法同時(shí)以讀取和寫入方式打開文本文件。因此需要常量 ForReading。
噢,也戴上您的帽兜。外面很冷。
接下來我們創(chuàng)建 FileSystemObject 的實(shí)例并使用 OpenTextFile 方法打開文件 C:\Scripts\Test.txt。我們調(diào)用 ReadAll 方法以將此文件的全部內(nèi)容讀取到變量 strContents 中,然后使用 Close 方法關(guān)閉文件。
之后的這行代碼很短并且有些古怪:
i = False
我們立即要做的就是建立 Do 循環(huán),該循環(huán)用 28 個(gè)字符的增量來讀取文件的內(nèi)容(即變量 strContents 的值)。為什么是 28 個(gè)字符?因?yàn)?,在每條記錄中,我們使用 6 個(gè)字符保存名字、13 個(gè)字符保存姓氏和 9 個(gè)字符保存部門。因此:
6 + 13 + 9 = 28
為了保證循環(huán)始終進(jìn)行直到整個(gè)文件讀取結(jié)束,我們將變量 i 設(shè)為 False,然后執(zhí)行循環(huán)直到 i 等于 True:
Do Until i = True
我們發(fā)現(xiàn),i 永遠(yuǎn)不會(huì)等于 True,但是別著急:我們?nèi)钥梢蕴龃搜h(huán),稍后就會(huì)向您顯示這種神奇的功能。
在循環(huán)內(nèi)部,我們首先使用 Len 函數(shù)來確定字符串 strContents 中字符的數(shù)量(對于我們的示例文件,再加上作為一條記錄的標(biāo)題行,共 3 條記錄,每條 28 個(gè)字符,即總共 84 個(gè)字符)。然后是以下這一小段代碼:
If intLength < 28 Then
Exit Do
End If
這里我們要做的就是檢查字符串長度是否少于 28 個(gè)字符。如果是,則我們一定已經(jīng)到達(dá)了文件的末尾。因此,我們使用 Exit Do 命令退出循環(huán)。(這就是非常了不起的腳本專家設(shè)法逃離永無休止的 Do 循環(huán)魔掌的方式!)
若長度為 28 個(gè)字符或更多,則執(zhí)行下面這行代碼:
strLines = strLines & Left(strContents, 28) & vbCrLf
此處我們創(chuàng)建一個(gè)新字符串 strLines,它將文本文件的內(nèi)容分成幾條單個(gè)記錄,每條記錄由 28 個(gè)字符及一個(gè)回車換行符 (vbCrLf) 組成。為此,我們只需將 strLine 的當(dāng)前內(nèi)容同字符串中的前 28 個(gè)字符(Left 函數(shù)執(zhí)行的正是此操作)及 VBScript 的常量 vbCrLf 連接起來即可。第一次循環(huán)之后 strLines 結(jié)果如下:
First Last Dept
明白其工作原理了嗎?
在第一行(也就是我們的第一條記錄)被安全地放到變量 strLines 中之后,接著我們就要將該信息從 strContents 中刪除。這就是下面的代碼所要執(zhí)行的操作:
strContents = Right(strContents, intLength - 28)
這次我們要使用 Right 函數(shù)從字符串末端取出 x 個(gè)字符,也就是逆向執(zhí)行。那么我們所說的 x 個(gè)字符到底是什么意思?要得到 x 的值,我們需取到 strContents 的長度 (84) 然后減去 28(單個(gè)記錄的長度)。得到的結(jié)果為 56 (84 - 28 = 56),因此我們從字符串的末端開始向回?cái)?shù) 56 個(gè)字符。這表示第一次循環(huán)之后我們會(huì)得到下面這樣的結(jié)果:
Ken Meyer Finance Pilar Ackerman HR
注意:是的,有其他的方法可以達(dá)到同樣的目的,其中一些可能會(huì)節(jié)省一兩行代碼。不過,我們認(rèn)為這種方法是最簡單的。
正如您所見,我們所做的全部工作就是刪除了第一條記錄?,F(xiàn)在準(zhǔn)備返回循環(huán),重復(fù)此過程。當(dāng)然,這次 strContents 的長度為 56;因?yàn)槲覀儎倓側(cè)サ袅?nbsp;28 個(gè)字符。自然,這意味著我們要停止提取此數(shù)據(jù)并停止將其添加到變量 strLines 中:
Ken Meyer Finance
我們繼續(xù)此過程直到刪除變量 strContents 中的所有字符。此時(shí),我們只是回顯 strLines 的值:
First Last Dept
Ken Meyer Finance
Pilar Ackerman HR
如果不是一個(gè)結(jié)構(gòu)良好的數(shù)據(jù)庫,那我們也不知道結(jié)果會(huì)是什么樣子。
如果您希望能夠?qū)?shù)據(jù)保存到一個(gè)文本文件并可以使用 ADO 讀取此數(shù)據(jù),就按我們講過的去做;或者也可以只使用 VBScript 的字符串處理功能來將每行分成若干單個(gè)記錄。我們將決定權(quán)留給了您。
您好,腳本專家!我有一個(gè)固定寬度的文本文件,該文件包含名字(6 個(gè)字符)、姓氏(13 個(gè)字符)和部門(9 個(gè)字符),并且它們均在同一行上。我該如何使用 ADO 來讀取呢?
-- DW
答:
您好,DW。坦白地講,我們認(rèn)為您不能使用 ADO(ActiveX 數(shù)據(jù)對象)讀取這樣的文件。ADO 是一種和文本文件進(jìn)行交互的非常好的方法(有關(guān)詳細(xì)信息,請參閱文章有關(guān)文本文件的 ADO 更多知識(shí)(英文)),但是,確實(shí),ADO 有些挑剔:它的每項(xiàng)設(shè)置都必須完全正確,否則就會(huì)拒絕工作。(不像腳本專家,即使所有事情都已準(zhǔn)備就緒,他們還是會(huì)拒絕工作。)作為一種數(shù)據(jù)庫技術(shù),ADO 需要一個(gè)“結(jié)構(gòu)良好”(借用 XML 領(lǐng)域的一個(gè)術(shù)語)的數(shù)據(jù)庫;它無法直接利用您那樣的文件格式并從中產(chǎn)生數(shù)據(jù)庫。(在這種情況下,可以將您的巨行分成若干單個(gè)記錄。)
但是沒關(guān)系;畢竟,我們可以使用雖古老但優(yōu)秀而可靠的 VBScript 來創(chuàng)建結(jié)構(gòu)良好的數(shù)據(jù)庫。我們今天要做的就是向您展示如何快速而便捷地將您的巨大數(shù)據(jù)字符串分割成單個(gè)記錄。只需通過將這些單個(gè)記錄(即,文本文件中的單個(gè)記錄)回顯到屏幕上我們就可以達(dá)到目的。不過,您可以將這些記錄段寫到另一個(gè)文本文件然后使用 ADO 從其中讀取數(shù)據(jù)。我們只是幫您開個(gè)頭,剩下的就要靠您自己了。
首先,我們假定您已擁有一個(gè)類似于下面的文本文件,該文件的字段名稱和兩條記錄包含于同一行之上:
First Last Dept Ken Meyer Finance Pilar Ackerman HR
我們希望最后的結(jié)果同下面的顯示更為相似:
First Last Dept
Ken Meyer Finance
Pilar Ackerman HR
這可能嗎?當(dāng)然可能:
復(fù)制代碼 代碼如下:
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt", ForReading)
strContents = objFile.ReadAll
objFile.Close
i = False
Do Until i = True
intLength = Len(strContents)
If intLength < 28 Then
Exit Do
End If
strLines = strLines & Left(strContents, 28) & vbCrLf
strContents = Right(strContents, intLength - 28)
Loop
Wscript.Echo strLines
注意:您知道您的母親為何一直告訴您要帶上帽兜或者在穿過街道的時(shí)候朝兩邊看嗎?是的,我們腳本專家也一直告訴您在沒有指定要打開的文本文件的方式的情況下是無法將其打開的:是讀取、寫入還是添加。一次只能執(zhí)行一項(xiàng)操作:無法同時(shí)以讀取和寫入方式打開文本文件。因此需要常量 ForReading。
噢,也戴上您的帽兜。外面很冷。
接下來我們創(chuàng)建 FileSystemObject 的實(shí)例并使用 OpenTextFile 方法打開文件 C:\Scripts\Test.txt。我們調(diào)用 ReadAll 方法以將此文件的全部內(nèi)容讀取到變量 strContents 中,然后使用 Close 方法關(guān)閉文件。
之后的這行代碼很短并且有些古怪:
i = False
我們立即要做的就是建立 Do 循環(huán),該循環(huán)用 28 個(gè)字符的增量來讀取文件的內(nèi)容(即變量 strContents 的值)。為什么是 28 個(gè)字符?因?yàn)?,在每條記錄中,我們使用 6 個(gè)字符保存名字、13 個(gè)字符保存姓氏和 9 個(gè)字符保存部門。因此:
6 + 13 + 9 = 28
為了保證循環(huán)始終進(jìn)行直到整個(gè)文件讀取結(jié)束,我們將變量 i 設(shè)為 False,然后執(zhí)行循環(huán)直到 i 等于 True:
Do Until i = True
我們發(fā)現(xiàn),i 永遠(yuǎn)不會(huì)等于 True,但是別著急:我們?nèi)钥梢蕴龃搜h(huán),稍后就會(huì)向您顯示這種神奇的功能。
在循環(huán)內(nèi)部,我們首先使用 Len 函數(shù)來確定字符串 strContents 中字符的數(shù)量(對于我們的示例文件,再加上作為一條記錄的標(biāo)題行,共 3 條記錄,每條 28 個(gè)字符,即總共 84 個(gè)字符)。然后是以下這一小段代碼:
If intLength < 28 Then
Exit Do
End If
這里我們要做的就是檢查字符串長度是否少于 28 個(gè)字符。如果是,則我們一定已經(jīng)到達(dá)了文件的末尾。因此,我們使用 Exit Do 命令退出循環(huán)。(這就是非常了不起的腳本專家設(shè)法逃離永無休止的 Do 循環(huán)魔掌的方式!)
若長度為 28 個(gè)字符或更多,則執(zhí)行下面這行代碼:
strLines = strLines & Left(strContents, 28) & vbCrLf
此處我們創(chuàng)建一個(gè)新字符串 strLines,它將文本文件的內(nèi)容分成幾條單個(gè)記錄,每條記錄由 28 個(gè)字符及一個(gè)回車換行符 (vbCrLf) 組成。為此,我們只需將 strLine 的當(dāng)前內(nèi)容同字符串中的前 28 個(gè)字符(Left 函數(shù)執(zhí)行的正是此操作)及 VBScript 的常量 vbCrLf 連接起來即可。第一次循環(huán)之后 strLines 結(jié)果如下:
First Last Dept
明白其工作原理了嗎?
在第一行(也就是我們的第一條記錄)被安全地放到變量 strLines 中之后,接著我們就要將該信息從 strContents 中刪除。這就是下面的代碼所要執(zhí)行的操作:
strContents = Right(strContents, intLength - 28)
這次我們要使用 Right 函數(shù)從字符串末端取出 x 個(gè)字符,也就是逆向執(zhí)行。那么我們所說的 x 個(gè)字符到底是什么意思?要得到 x 的值,我們需取到 strContents 的長度 (84) 然后減去 28(單個(gè)記錄的長度)。得到的結(jié)果為 56 (84 - 28 = 56),因此我們從字符串的末端開始向回?cái)?shù) 56 個(gè)字符。這表示第一次循環(huán)之后我們會(huì)得到下面這樣的結(jié)果:
Ken Meyer Finance Pilar Ackerman HR
注意:是的,有其他的方法可以達(dá)到同樣的目的,其中一些可能會(huì)節(jié)省一兩行代碼。不過,我們認(rèn)為這種方法是最簡單的。
正如您所見,我們所做的全部工作就是刪除了第一條記錄?,F(xiàn)在準(zhǔn)備返回循環(huán),重復(fù)此過程。當(dāng)然,這次 strContents 的長度為 56;因?yàn)槲覀儎倓側(cè)サ袅?nbsp;28 個(gè)字符。自然,這意味著我們要停止提取此數(shù)據(jù)并停止將其添加到變量 strLines 中:
Ken Meyer Finance
我們繼續(xù)此過程直到刪除變量 strContents 中的所有字符。此時(shí),我們只是回顯 strLines 的值:
First Last Dept
Ken Meyer Finance
Pilar Ackerman HR
如果不是一個(gè)結(jié)構(gòu)良好的數(shù)據(jù)庫,那我們也不知道結(jié)果會(huì)是什么樣子。
如果您希望能夠?qū)?shù)據(jù)保存到一個(gè)文本文件并可以使用 ADO 讀取此數(shù)據(jù),就按我們講過的去做;或者也可以只使用 VBScript 的字符串處理功能來將每行分成若干單個(gè)記錄。我們將決定權(quán)留給了您。
相關(guān)文章
用VBS實(shí)現(xiàn)一個(gè)小鍵盤動(dòng)作CTRL+V粘貼操作與思路分析
我想實(shí)現(xiàn)當(dāng)有跳出窗口"請輸入"時(shí)的1.8秒后就發(fā)送一次 CTRL + V,把本來已經(jīng)復(fù)制到剪切版中的文字自動(dòng)粘貼過去呢2009-12-12用vbs實(shí)現(xiàn)本地連接禁用/啟用腳本代碼
用vbs實(shí)現(xiàn)本地連接禁用/啟用腳本代碼...2007-03-03VBS 正則判別素?cái)?shù)(質(zhì)數(shù))
利用正則判別素?cái)?shù),來源于網(wǎng)絡(luò),神人,喜歡vbs的朋友可以參考下2013-07-07在windows 64位操作系統(tǒng)上運(yùn)行32位的vbscript的方法
這篇文章主要介紹了在windows 64位操作系統(tǒng)上運(yùn)行32位的vbscript的方法,需要的朋友可以參考下2016-11-11vbs實(shí)現(xiàn)unicode和ascii編碼轉(zhuǎn)換
這篇文章主要介紹了vbs實(shí)現(xiàn)unicode和ascii編碼轉(zhuǎn)換,本文同時(shí)介紹了OpenTextFile和CreateTextFile的使用,需要的朋友可以參考下2014-11-11VBS教程:函數(shù)-IsObject 函數(shù)
VBS教程:函數(shù)-IsObject 函數(shù)...2006-11-11