CSV文件的內(nèi)容并導入到數(shù)據(jù)庫中.doc_第1頁
CSV文件的內(nèi)容并導入到數(shù)據(jù)庫中.doc_第2頁
CSV文件的內(nèi)容并導入到數(shù)據(jù)庫中.doc_第3頁
CSV文件的內(nèi)容并導入到數(shù)據(jù)庫中.doc_第4頁
CSV文件的內(nèi)容并導入到數(shù)據(jù)庫中.doc_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

功能:讀取CSV文件的內(nèi)容并導入到數(shù)據(jù)庫中環(huán)境:Access2003 語言:VBA(對于使用VB6.0同樣適用)數(shù)據(jù)庫:D:db1.mdb數(shù)據(jù)表:testuserId 數(shù)值型 userName 文本型 CSV文件:D:test.csv (使用Excel打開)編號 姓名 123 王五 456 李“四 789 張三 注意,在實際處理CSV文件前,程序開發(fā)者必須了解CSV文件的真實結(jié)構(gòu)。為了說明在處理CSV文件時可能遇到的特殊情況,用于測試的CSV文件的最后兩行的“姓名”列均插入了特殊字符。由于在顯示CSV文件內(nèi)容時,Excel已經(jīng)對CSV文件進行了處理,因此,上面使用Excel所看到的內(nèi)容并不是CSV的真實內(nèi)容。如果使用文本編輯器打開,可以看到真實的內(nèi)容為:-編號, 姓名123, 王五456, 李“四789, 張三-之所以出現(xiàn)這樣的內(nèi)容,是因為我們通常使用Excel編輯CSV文件,然后使用另存為命令保存為CSV文件。這一過程中,Excel會隱蔽地進行如下處理:1 CSV文件將Excel的同一行中不同單元格的內(nèi)容使用,(半角逗號分隔開) 2 當內(nèi)容中出現(xiàn)半角雙引號時會自動被轉(zhuǎn)義為兩個雙引號,即 ;同時內(nèi)容整體的兩端自動被雙引號引起來。例如:李“四 - 李“四 了解了數(shù)據(jù)表和CSV文件的結(jié)構(gòu),下面就可以編寫代碼了。-1. Option Compare Binary 聲明作用:聲明當前VB環(huán)境中字符串的比較方式這里的 Binary 聲明當前VB環(huán)境中的字符串依照其在內(nèi)存中的字節(jié)碼來進行比較如果你使用的是普通VB6.0環(huán)境,默認的字符串比較就是依照字節(jié)碼比較但是,如果你使用的是Access VBA進行開發(fā),就要特別注意了。Access VBA開發(fā)時會在全部代碼之前默認追加聲明:Option Compare Database也就是說,Access VBA默認依照Access數(shù)據(jù)庫中存儲的比較規(guī)則進行字符串比較所以,普通VB6.0開發(fā)環(huán)境與Access VBA開發(fā)環(huán)境的默認字符串比較方式不同。VB6.0的默認字符串比較方式是Binary,Access VBA的默認字符串比較方式是Database。注意:Database比較方式對全角和半角不敏感。例如,“,”, 與 在Database方式下將被視為相等所以,如果你的程序使用Access VBA開發(fā),同時又要進行全角與半角的比較時應當使用Binary比較方式,而不是接受Access VBA的默認設置,即你的程序的首行必須是:Option Compare Binary2.全部代碼如下:聲明當前VB環(huán)境中字符串的比較方式為字節(jié)碼Option Compare Binary要測試本例的文件操作,就新建一個窗體,在上面添加一個名為“cmdImport”的按鈕,單擊后即執(zhí)行下面的方法,完成文件讀取和寫入數(shù)據(jù)庫的操作函數(shù)開始-主函數(shù),執(zhí)行的開始Private Sub cmdImport_Click() Dim cn As New ADODB.Connection 指定連接字符串,本例連接到 D:db1.mdb 數(shù)據(jù)庫 cn.ConnectionString = _ Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb 開啟連接,準備對數(shù)據(jù)庫操作 cn.Open 定義存儲文件名的對象 Dim fileName As String 指定要讀取的CSV文件的名稱本例為 D:test.csv fileName = D:test.csv 執(zhí)行ImportFile函數(shù),完成以下操作: 1 讀取 D:test.csv 文件的內(nèi)容 2 將讀取的文件內(nèi)容寫入 D:db1.mdb 數(shù)據(jù)庫的 test 表中 ImportFile cn, test, fileName 完成操作后關閉連接 cn.Close 將連接設置為 Nothing ,及時釋放其所占用的內(nèi)存空間 Set cn = NothingEnd Sub函數(shù)結(jié)束-函數(shù)開始-參數(shù)-1. cn 使用的數(shù)據(jù)庫聯(lián)接,本例連接到 D:db1.mdb2. tblName 使用的數(shù)據(jù)庫表名稱,本例為 test3. FileFullPath 讀取的CSV文件目錄(包括文件名),本例為 D:test.csv4. FieldDelimiter 指定CSV文件同一行內(nèi)容以哪種字符分隔 默認為 ,(半角逗號)5. RecordDelimiter 指定CSV文件不同行內(nèi)容以哪種字符分隔 默認為 vbCrLf(回車換行符)參數(shù)- Public Sub ImportFile(cn As Object, _ ByVal tblName As String, FileFullPath As String, _ Optional FieldDelimiter As String = , _ Optional RecordDelimiter As String = vbCrLf) Dim cmd As New ADODB.Command Dim rs As New ADODB.Recordset Dim iFileNum As Integer Dim sFileContents As String Dim sTableSplit() As String Dim sRecordSplit() As String Dim lCtr As Integer Dim iCtr As Integer Dim lRecordCount As Long Dim iFieldsToImport As Integer Dim asFieldNames() As String Dim abFieldIsString() As Boolean Dim iFieldCount As Integer Dim sSQL As String 判斷傳入的cn參數(shù)是否是數(shù)據(jù)庫連接對象,如果不是,退出程序 If Not TypeOf cn Is ADODB.Connection Then Exit Sub 判斷指定目錄下的CSV文件是否真實存在,如果不是,退出程序 If Dir(FileFullPath) = Then Exit Sub 判斷數(shù)據(jù)庫聯(lián)接是否已打開,如果沒有則打開連接 If cn.State = 0 Then cn.Open 使用數(shù)據(jù)庫聯(lián)接 cn 打開一個數(shù)據(jù)集 rs rs 的數(shù)據(jù)來源是指定表名 tblName 中的全部數(shù)據(jù),打開方式是 adOpenKeyset rs.Open select * from & tblName, cn, adOpenKeyset 取得數(shù)據(jù)集字段數(shù)目 iFieldCount = rs.Fields.Count 重新定義asFieldNames的大小,用來存放數(shù)據(jù)表(本例為 test)的字段名 ReDim asFieldNames(iFieldCount - 1) As String 與上面的asFieldNames中存儲的字段名一一對應,記錄數(shù)據(jù)表的每一個字段是否是字符串類型 ReDim abFieldIsString(iFieldCount - 1) As Boolean 遍歷數(shù)據(jù)表的所有字段: For iCtr = 0 To iFieldCount - 1 記錄數(shù)據(jù)表的字段名 asFieldNames(iCtr) = & rs.Fields(iCtr).Name & 記錄數(shù)據(jù)表的字段是否是字符串類型 abFieldIsString(iCtr) = FieldIsString(rs.Fields(iCtr) Next 使用FreeFile分配一個文件號 iFileNum = FreeFile 打開指定路徑下的文件(本例中即 D:test.csv 文件) 注意:這里使用字節(jié)(Binary)方式打開文件, 原因:在下面讀取CSV文件內(nèi)容的操作中使用了LOF函數(shù)取得文件長度 如果使用文本方式打開文件,那么,由于文件中存在中文字符, 長度計算就會不正確,因此,采用Binary方式打開文件 Open FileFullPath For Binary As #iFileNum 使用LOF計算文件長度,分配所需的內(nèi)存空間,并使 sFileContents 變量指向這一空間 sFileContents = Space(LOF(iFileNum) 將文件內(nèi)容全部讀取到 sFileContents 變量中 Get #iFileNum, , sFileContents 讀取完成后,關閉文件 Close #iFileNum 以vbCrLf(回車換行符)作為換行標志,將CSV文件的內(nèi)容分解為一個由若干字符串行組成的數(shù)組 并把數(shù)組內(nèi)容存儲到 sTableSplit 數(shù)組中 sTableSplit = Split(sFileContents, RecordDelimiter) 獲得 sTableSplit 數(shù)組上界(即CSV文件行數(shù)),存儲到 lRecordCount 中 lRecordCount = UBound(sTableSplit) 開始事務處理 cn.BeginTrans lRecordCount 記錄了CSV文件的行數(shù),下面通過循環(huán)依次處理CSV文件的每一行 For lCtr = 1 To lRecordCount - 1 以 ,(半角逗號)將CSV文件同一行中的內(nèi)容劃分為一個字符串數(shù)組, 并把數(shù)組內(nèi)容存儲到 sRecordSplit 數(shù)組中 sRecordSplit = Split(sTableSplit(lCtr), FieldDelimiter) CSV文件的一行中以 ,(半角逗號)劃分出的數(shù)組長度和數(shù)據(jù)表的字段數(shù)可能不一致 因此,取兩者之中長度最小的作為處理的基準 例如,文件的某一行數(shù)據(jù)為馬,牛,羊 這一行數(shù)據(jù)劃分后獲得的 sRecordSplit 數(shù)組內(nèi)容為 sRecordSplit = 馬,牛,羊,長度為 3 而數(shù)據(jù)表有 userId 和 userName 兩個字段,字段數(shù)為 2,那么最終將 iFieldsToImport = 2 iFieldsToImport = IIf(UBound(sRecordSplit) + 1 _ iFieldCount, UBound(sRecordSplit) + 1, iFieldCount) 下面,要把CSV文件當前行的內(nèi)容插入到數(shù)據(jù)表中,為此開始準備SQL文本 sSQL = INSERT INTO & tblName & ( 使用循環(huán)將 asFieldNames 數(shù)組中存儲的字段名依次追加到SQL文中 For iCtr = 0 To iFieldsToImport - 1 sSQL = sSQL & asFieldNames(iCtr) If iCtr iFieldsToImport - 1 Then sSQL = sSQL & , Next iCtr sSQL = sSQL & ) VALUES ( sRecordSplit 是在上面的處理中,由CSV文件同一行中的內(nèi)容所轉(zhuǎn)化成的數(shù)組 現(xiàn)在,將這個數(shù)組的內(nèi)容添加到SQL文本的VALUES集合中 For iCtr = 0 To iFieldsToImport - 1 If abFieldIsString(iCtr) Then 如果值為文本,需要做特別處理(主要是針對CSV文件中的半角單引號和半角雙引號) sSQL = sSQL & prepStringForSQL(sRecordSplit(iCtr) Else 如果不是文本,就直接添加到SQL文本的VALUES集合中 sSQL = sSQL & sRecordSplit(iCtr) End If 如果不是最后一個值,那么,在追加到SQL文本的VALUES集合時,不要忘記 在其后追加一個半角逗號 If iCtr 李“四 If Len(sAns) 0 Then If Left(sAns, 1) = Chr(34) Then sAns = Right(sAns, Len(sAns) - 1) If Len(sAns) 0 Then If Right(sAns, 1) = Chr(34) Then sAns = Left(sAns, Len(sAns) - 1) End If End If End If End If 去掉字符串中可能被自動追加的半角雙引號 例如: 李“四 - 李“四 sAns = Replace(sAns, Chr(34

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論