Scripting Guy 為您解答問題
歡迎使用 TechNet 專欄,Microsoft Scripting Guy 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。
資源
如何將 .CSV 檔匯入 Access 資料庫?
嗨,Scripting Guy!如何將 .CSV 檔匯入 Access 資料庫? -- CS |
|
CS,您好。我們將馬上切入您的問題。不過,首先,我們想要分享一些對「第 41 屆超級杯足球聯賽」的想法: |
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const ForReading = 1
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
objConnection.Open _
"Provider = Microsoft.Jet.OLEDB.4.0; " & _
"Data Source = c:\scripts\test.mdb"
objRecordSet.Open "SELECT * FROM Employees", _
objConnection, adOpenStatic, adLockOptimistic
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt")
Do Until objFile.AtEndOfStream
strEmployee = objFile.ReadLine
arrEmployee = Split(strEmployee, ",")
objRecordSet.AddNew
objRecordSet("EmployeeID") = arrEmployee(0)
objRecordSet("EmployeeName") = arrEmployee(1)
objRecordSet("Department") = arrEmployee(2)
objRecordSet.Update
Loop
objRecordSet.Close
objConnection.Close
老實說,我們也不知道任何可以直接將逗點分隔值檔案匯入 Access 資料庫的方法 (並不是沒有這種方法,只是我們不知道而已)。不過,使用指令碼來開啟 .CSV 檔,然後「手動」將新資料錄加入至資料庫卻相當簡單。這就是我們的做法。
CS,我們假設您已經建立了 Access 資料庫。針對範例指令碼,我們使用了名為 C:\Scripts\Test.mdb 的資料庫。在該資料庫內部,我們設有一個名為 Employees 的資料表。這個資料表包含三個欄位:
EmployeeID
EmployeeName
Department
您可能會猜想,文字檔 (C:\Scripts\Test.txt) 也包含三個欄位。所以:
1989,Ken Myer,Finance
1990,Pilar Ackerman,Research
1991,Jonathan Hass,Human Resources
在此情況下,我們有三個要加入至資料庫的新員工。進行這項作業的方法如下。
我們一開始先定義三個常數:adOpenStatic 和 adLockOptimistic (用於處理資料庫),以及 ForReading (用於處理文字檔)。然後,使用下列程式碼區塊來開啟 Test.mdb 並建立資料錄集 (其中包含 Employees 資料表中的所有項目):
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
objConnection.Open _
"Provider = Microsoft.Jet.OLEDB.4.0; " & _
"Data Source = c:\scripts\test.mdb"
objRecordSet.Open "SELECT * FROM Employees", _
objConnection, adOpenStatic, adLockOptimistic
您可能會感到奇怪,上述所有程式碼幾乎都是可直接使用的現成程式碼。您唯一可能需要變更的就是資料庫檔案的路徑和資料表的名稱。
開啟資料庫之後,下一步就是要開啟文字檔。若要這樣做,我們要先建立 Scripting.FileSystemObject 的執行個體,然後使用 OpenTextFile 方法來開啟 Test.txt 檔,以便進行讀取:
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt")
接下來我們就要開始將資料錄加入至資料庫了。首先,我們要設定一個執行到文字檔結尾為止的 Do Until 迴圈 (也就是,直到 AtEndOfStream 屬性為 True 為止)。在該迴圈內部,我們要使用 ReadLine 方法,從文字檔的第一行開始讀取,然後將該值儲存在名為 strEmployee 的變數中:
strEmployee = objFile.ReadLine
這是什麼意思呢?這表示當時 strEmployee 等於:
1989,Ken Myer,Finance
這樣確實有效,但是卻幫助不大:我們需要從該字串剖析個別欄位值。所幸,我們可以使用 Split 函數並以逗點分隔字串來完成此作業:
arrEmployee = Split(strEmployee, ",")
這樣會有什麼結果?這樣會產生包含下列三個項目的陣列 (名為 arrEmployee):
1989
Ken Myer
Finance
您猜會怎麼樣?這三個項目都剛好對應至資料庫中的三個欄位。
如此一來,這表示我們現在可以將 Ken Myer 加入至資料庫。若要這樣做,我們可以呼叫 AddNew 方法,將新資料錄加入至 Employees 資料表。然後,我們可以使用下列程式碼來指定欄位值:
objRecordSet("EmployeeID") = arrEmployee(0)
objRecordSet("EmployeeName") = arrEmployee(1)
objRecordSet("Department") = arrEmployee(2)
這裡沒有太複雜的內容。在第 1 行中,我們只是將 EmployeeID 欄位的值設定為陣列中項目 0 的值(請記住,在 VBScript 陣列中,第一個項目永遠具有索引編號 0)。在第 2 行中,我們將 EmployeeName 欄位的值設定為陣列中項目 1 的值 (第二個項目)。然後依此類推。
在指派所有欄位值之後,我們接著要呼叫 Update 方法,將新資料錄寫入資料庫。
objRecordSet.Update
接著我們再執行迴圈,對文字檔中的下一行重複此程序。然後依此類推。
等等,我們說到哪了?喔,對了,「超級杯足球聯賽」。事實上,對於撰寫本專欄的 Scripting Guy 而言,「超級杯足球聯賽」中最棒的一部分就是聆聽所有「專業」球評的評論。舉例來說,過去兩週以來,在「印第安納波利斯印地安人隊」的四分衛 Peyton Manning 贏得「超級杯足球聯賽」以前,沒有人認為他是優秀的四分衛(有趣的旁註:這些相同的評論員都認為「名人堂」的 Dan Marino 和 Warren Moon 才是優秀的四分衛。猜猜看這些優秀的四分衛贏過多少場「超級杯足球聯賽」)。當他最後贏得「超級杯足球聯賽」時,這些評論員對於 Peyton Manning 有何評語?「贏得一場『超級杯足球聯賽』雖然很棒,但是就一位真正優秀的四分衛而言,至少要贏得兩場『超級杯足球聯賽』」。
或許 Peyton Manning 應該從橋上跳下,然後讓一切結束。
有趣的旁註 2:這些相同的評論員都認為「綠灣包裝工」球隊的 Brett Favre 是優秀的四分衛 (可能也永遠是最好的四分衛)。當然,這表示 Brett Favre 至少贏過兩場「超級杯足球聯賽」,對吧?呃,大概有吧。這就讓讀者自己想想看... |
編輯旁註:忘掉「超級杯足球聯賽」的廣告吧。過去幾年來,「Daytona 500 汽車大賽」廣告的鋒芒早就蓋過「超級杯足球聯賽」的廣告了。 |