我現在有一個TXT檔案其中有2000個資料,然后需要匯入到VB中。TXT中2000組資料每個資料一行一共2000行;把這2000個資料匯入到20個List中,每100個一組(List1.List(0)~List1.List(99))。我用最笨的方法就是一個一個的選擇輸入到VB中,如下
Open "d:\1.txt" For Output As #1
Do While Not EOF(1)
i = i + 1
Line Input #1, kk
Select Case i
Case 1:List1.List(0)= kk:Case2:List1.List(1)= kk:Case 3:List1.List(2)= kk
(此處省略上千條......)
End Select
Loop
Close #1
End Sub
最開始數量少的時候還能執行,但是現在程式過大,然后執行的時候提示“程序太大”,現在遇到這個問題解決不掉了。
然后我個人感覺有兩種渠道,第一種就是能不能把讀取的分為多步陳述句去執行,類似每次讀取500行,然后最后在一個按鈕里執行多步;第二種就是在Case 中使用For回圈,這種方法我試過但是不知道為什么不能執行。或者有其他方法能解決這類問題嗎?最頭疼的是這2000個資料不全是格式相同,然后不想換List1~List20了因為真心設計了好久再換作業量太大了。
求助各位大神啊,本人非VB專業人事,只是感興趣然后在幫人做個小程式,目前遇到瓶頸了,快瘋了..........
uj5u.com熱心網友回復:
你是“從檔案讀取資料”,打開檔案的模式怎么會用“Output”?
你的20個串列控制元件 “List1”最好也弄成控制元件陣列。
這樣就可以(假設“檔案行數”沒有超過你的“預期數量”2000行):
Dim i As Long
Open "d:\1.txt" For Input As #1
i = -1
Do While Not EOF(1)
Line Input #1, kk
i = i + 1
List1(i\100).AddItem kk
Loop
Close #1
如果你的20個串列控制元件是“獨立控制元件”,也就是 List1、List2、List3、……List20,那就稍微麻煩點兒。
不過也就是最多再增加10來行代碼的事。
uj5u.com熱心網友回復:
Dim i As Long
Dim m As ListBox
Dim kk As String
For Each m In Me.Controls
m.Clear
Next m
Set m = List1
Open "d:\1.txt" For Input As #1
Do Until EOF(1)
If i Mod 100 Then Goto GetRecord
If i = 100 Then
Set m = List2
ElseIf i = 200 Then
Set m = List3
ElseIf i = 300 Then
Set m = List4
...
ElseIf i = 1800 Then
Set m = List19
Else
Set m = List20
End If
GetRecord:
Line Input #1, kk
m.AddItem kk
i = i + 1
Loop
Close #1
uj5u.com熱心網友回復:
其實用不著 20 個 ListBox。只需要 2 個,一個用于保存資料,另一個用于顯示。
Dim Starting_Record As Long
Private Sub Form_Load()
Dim kk As String
Dim i As Long
List1.Visible = False
Open "d:\1.txt" For Input As #1
Do Until EOF(1)
Line Input #1, kk
List1.AddItem kk
If i < 100 Then List2.Additem kk
i = i + 1
Loop
Close #1
End Sub
Private Sub Command1_Click() '下一頁
If List1.ListCount > Starting_Record + 100 Then
Starting_Record = Starting_Record + 100
List2.Clear
For i = Starting_Record To Starting_Record + 99
List2.AddItem List1.List(i)
If i = List1.ListCount -1 Then Exit For
Next i
Else
Msgbox "已經到達最后一頁"
End If
End Sub
Private Sub Command2_Click() '上一頁
If Starting_Record > 0 Then
Starting_Record = Starting_Record - 100
List2.Clear
For i = Starting_Record To Starting_Record + 99
List2.AddItem List1.List(i)
Next i
Else
Msgbox "已經到達第一頁"
End If
End Sub
uj5u.com熱心網友回復:
如果樓主的是“分頁顯示”,資料直接保存在字串陣列中不就行了?只要一個ListBox就行了。
你2樓的那一堆 If .... Elseif ..... ,據說有一種“Select”結構的語法,更適合一點。
uj5u.com熱心網友回復:
Option Explicit
Private Sub FillList(ByVal hFile As Integer, ByVal lst As ListBox)
Dim i As Long
Dim kk As String
lst.Clear
For i = 1 To 100
If EOF(hFile) Then Exit For
Line Input #hFile, kk
lst.AddItem kk
Next
End Sub
Private Sub Command1_Click()
Dim hFile As Integer
hFile = FreeFile()
Open "d:\1.txt" For Input As #hFile
FillList hFile, List1
FillList hFile, List2
...
FillList hFile, List20
Close #hFile
End Sub
uj5u.com熱心網友回復:
陣列與 Listbox 保存資料,各有優劣。比如,ListBox 不用預先設定空間大小,AddItem 就可了。如果需要清空,Clear 就完事了。
至于 ElseIf 與 Select Case ,沒有太大區別,不存在了哪一個更合適。
代碼風格之爭,沒太大意思,看不出有什么特別的創意。
uj5u.com熱心網友回復:
另外,看不出 20 個 ListBox 同時顯示的好處在哪兒。如果只顯示其中一個,不就是分頁顯示嗎?uj5u.com熱心網友回復:
1,控制元件陣列。2,根據行號,算出放到哪個下標的Listbox中。
uj5u.com熱心網友回復:
+1
uj5u.com熱心網友回復:
其實我不大喜歡系結一大堆資料,我當心如果一堆資料,可能會占用很多記憶體,而且for回圈n多次其實也會耗時間,我的思路是每次根據不能的需求讀取txt相應的內容,程式可能會多幾行,個人覺得如果資料大了,效率就體現出來了。新人一枚,有錯的地方求指正!uj5u.com熱心網友回復:
在現實世界中,除時間和空間可能是無限的以外,其它任何事物都是有限的。uj5u.com熱心網友回復:
1. 面對“一堆資料”,它究竟需要多少記憶體,多數情況下是可以預測(或估算)的,
以目前的計算機硬體資源來說,只要不是占用得太過分,基本上不會有什么問題。
2. 樓主的是“文本檔案”,大多數情況下,文本檔案是不能“按資料位置(第幾行、第幾項資料等引數)”,
來確定檔案資料的位置的(要讀取的內容的“偏移量”)。
如果“需要時再讀取”,基本上是每次“需要時”就要從檔案開始、讀到“需要的位置處”,
實際上這樣的操作方式,運行效率很低,根本就比不上一次性全部讀入記憶體、并進行有效管理的方法。
uj5u.com熱心網友回復:
當一個可執行程式啟動時,系統會為它分配一片“虛擬記憶體”,其中一小部分是實際記憶體,大部分是磁盤空間。實際上,當讀取非常多的資料時,系統會將“虛擬記憶體”中的內容快取到硬碟中。當訪問的內容超出實際快取在實際記憶體中的范圍時,依然需要進行磁盤訪問。這樣的話,“記憶體”中的資料未必比從檔案中臨時讀取更快。
“一次性全部讀入記憶體、并進行有效管理”只是一種美好的假設。
uj5u.com熱心網友回復:
美好的假設?
請問,大家平時寫的與“檔案讀寫”有關的程式,有多少是處理幾百MB、甚至上GB的?
多數情況下,也不過就是幾十、幾百KB而已,能上幾十MB的時候都少得很吧!
這么一點資料,會被“隨時丟到快取”中去?
現在的電腦,4G、8G記憶體的多的是,低于2GB的已經很少了,
就算2GB記憶體的電腦,平時“空閑”記憶體1個多G也是“常態化”的事,
運行個小程式,資料會動不動就被系統扔到“快取”?
就算在快取中,代碼中按“直接訪問資料”的方式讀取資料,
系統的記憶體管理模塊也可以快速的定位、加載資料,
也總比你“需要的時候,去打開檔案,從檔案開始讀到需要讀取的地方”快吧!
難道你還能對“大量資料”的文本檔案,做到“隨機讀取”不成!!!
uj5u.com熱心網友回復:
沒錯,我曾經做過對非常大的資料檔案進行分析的軟體,就是用二進制模式逐次讀取的。實際上,二進制檔案打開之后,就在虛擬記憶體中。試過多種方式,包括“一次性” Input 模式讀取全部資料,那樣的話,軟體打開時要等很久。
我講話都是根據實際經驗的,沒有拍腦袋。
uj5u.com熱心網友回復:
每個專案都需要根據具體情況設計方案。專案經驗不同會產生不同的偏好,不存在永遠適用的方案,無關對錯,有什么好爭論的。
#10就是來歪樓的

又不是樓主碰到實際問題來求助,沒有討論的必要。
uj5u.com熱心網友回復:
在檔案大小相同的前提下:讀剛讀過的檔案比頭次讀沒讀過的檔案快
讀轉速快的硬碟上的檔案比讀轉速慢的硬碟上的檔案快
讀沒有磁盤碎片的檔案比讀有磁盤碎片的檔案快
讀檔案不處理比邊讀邊處理快
單執行緒從頭到尾一次讀檔案比多執行緒分別讀檔案各部分快(非固態硬碟上)
讀固態硬碟上的檔案比讀普通硬碟上的檔案快
您是否希望迅速對您頻繁使用的檔案進行碎片整理?使用 Contig 優化單個的檔案,或者創建連續的新檔案。http://technet.microsoft.com/zh-cn/sysinternals/bb897428
uj5u.com熱心網友回復:
回15樓:你說的“非常大的資料檔案”,與樓主說的問題,根本就不一回事好不!
一般的“資料”檔案,適合用二進制模式讀寫,對于“非常大的檔案”,肯定不適合一次性讀進記憶體。

首先,樓主說的“文本檔案”,可能沒法用二進制模式來進行“隨機”讀取;
其次,對那些沒什么經驗、水平的人,對他們來說,可能幾百K、幾MB的檔案,就是“大量資料”了,
其實這么點兒資料,完全算不上“大量”。
對于有一定編程水平的人,對“大量資料”讀取、又要保證運行效率,根本不會采用“純文本”方式來記錄,
都是用“隨機檔案”,或者“二進制”檔案結構來進行記錄資料專案的,
文本檔案,最多只作為“原始輸入”的資料源(多數情況是“第3方程式”生成的),進行一次性的使用而已。
這種情況下,怎么“讀”基本上用不著過多的考慮。

uj5u.com熱心網友回復:
Dim I As Long, J As Long, A As String, AA() As String
Open "D:\1.txt" For Input As #1
For J = 1 To 300000 '這個300000 是不知道行數隨便設定的一個回圈值,這個值可以盡量大
If Not EOF(1) Then
I = I + 1 '得到總行數
Input #1, A
Else
Exit For '到達檔案末尾退出回圈
End If
Next J
Close #1
'--------------上面得到 1.txt 檔案的總行數
Label1.Caption = "D:\1.txt文本檔案包含有" & I & "行記錄!"
ReDim AA(1 To I) '設定陣列的下標
Open "D:\1.txt" For Input As #1
For J = 1 To I
If Not EOF(1) Then
Input #1, AA(J) '將內容存盤到陣列
List1.AddItem AA(J) '將陣列內容加載到控制元件
Else
Exit For
End If
Next J
Close #1

這個運行不到1秒,是35000行記錄。
uj5u.com熱心網友回復:
呵呵,“大量資料”的來源和格式,并非由你控制的。我做的幾個專案,偏偏儀器或軟體輸出的就是非常大的文本。用二進制逐次讀取文本資料,一點兒都不稀罕。無非向前搜索一下回車換行符,將之后的資料快取待下一輪處理而已。拍腦袋真不是什么好習慣。
BTW,我只是在這個帖子中回應一下大檔案“一次性”讀取的看法,與樓主的應用無關。不必硬扯到一起。
uj5u.com熱心網友回復:
InputBuj5u.com熱心網友回復:
Input 函式
回傳 String,它包含以 Input 或 Binary 方式打開的檔案中的字符。
語法
Input(number, [#]filenumber)
Input 函式的語法具有以下幾個部分:
部分 描述
number 必要。任何有效的數值運算式,指定要回傳的字符個數。
filenumber 必要。任何有效的檔案號。
說明
通常用 Print # 或 Put 將 Input 函式讀出的資料寫入檔案。Input 函式只用于以 Input 或 Binary 方式打開的檔案。
與 Input # 陳述句不同,Input 函式回傳它所讀出的所有字符,包括逗號、回車符、空白列、換行符、引號和前導空格等。
對于 Binary 訪問型別打開的檔案,如果試圖用 Input 函式讀出整個檔案,則會在 EOF 回傳 True 時產生錯誤。在用 Input 讀出二進制檔案時,要用 LOF 和 Loc 函式代替 EOF 函式,而在使用 EOF 函式時要配合以 Get 函式。
注意 對于文本檔案中包含的位元組資料要使用 InputB 函式。對于 InputB 來說,number 指定的是要回傳的位元組個數,而不是要回傳的字符個數。
uj5u.com熱心網友回復:
突然發現,趙4老師,不僅編程功底深,哲學也很在行。
uj5u.com熱心網友回復:
任何問題首先是一個哲學問題。不是嗎?
推薦閱讀:
《黑客帝國》完全決議_知識庫_博客園
《黑客帝國》里的錫安是不是虛擬世界_知識庫_博客園
uj5u.com熱心網友回復:
chr(13) & chr(10),mid(ttt5,j,1)逐個捉拿合成變數,變數代入,一切讓電腦來做,又快又輕松!你可能下載的是<李國字詞句軟體>,我現在要告訴你的是另一套軟體==【李國獻手寫板軟體】,不需要下載分數,準確下載地址是http://download.csdn.net/detail/csdn967/9769913,本人掌握核心技術,不需要硬體設備,滑鼠在螢屏上書寫,你個人風格的草書,程式能夠自我建庫、不斷完善、建庫越多,出字也越準確,
請用滑鼠雙擊表單,會彈出使用說明書(滑鼠放在某按扭上面,彈出字介紹這個按扭的用途和使用方法),再一次滑鼠雙擊表單邊緣,介紹字又隱藏起來,
總之,中間小紅字很重要,你草寫的字筆畫,就是代表它這個字,一定要點擊【擊0】,右雙擊筆畫擦圖干凈后,再畫筆畫后一定要點擊【擊0】,幾次點擊【擊0】之后,此字會出現在紫色框中:表明此字建庫完成,后可以識別這個字了。
更多介紹請用滑鼠雙擊表單,會彈出使用說明書
uj5u.com熱心網友回復:
Binary 訪問型別打開檔案, InputB 函式讀出整個檔案uj5u.com熱心網友回復:
我就是喜歡看到各種技術與手段的碰撞哈哈這樣的話才能有進步,我才能從中偷偷提升經驗值.......
uj5u.com熱心網友回復:
呵呵,“大量資料”的來源和格式,并非由你控制的。我做的幾個專案,偏偏儀器或軟體輸出的就是非常大的文本。用二進制逐次讀取文本資料,一點兒都不稀罕。無非向前搜索一下回車換行符,將之后的資料快取待下一輪處理而已。
拍腦袋真不是什么好習慣。
BTW,我只是在這個帖子中回應一下大檔案“一次性”讀取的看法,與樓主的應用無關。不必硬扯到一起。
只有你是“合理解決問題”的,別人的任何觀點、看法都是“拍腦袋”?
我哪提出“資料來源要求是指定格式”?
我在18樓已經說過‘多數情況是“第3方程式”生成的’,
當然也就明白“來源”的格式不是由自己控制,只能是“自己的程式去適應相應的格式”。
樓主來問解決問題的方法,你卻是跑來說一堆“與樓主的應用無關”的話…………
uj5u.com熱心網友回復:
我就是喜歡看到各種技術與手段的碰撞哈哈
這樣的話才能有進步,我才能從中偷偷提升經驗值.......
就算壁虎學會了所有人的經驗,那又能如何?

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/60920.html
標籤:VB基礎類
