這種方式為什么讀取大資料csv時,文本框輸出特別慢
Private Sub Command6_Click()
Dim TextLine
Dim TextString
Dim SplitStr As Variant
Dim SplitStr2 As Variant
Dim i As Long, j As Long
Dim s As String
Dim m, n As Integer
Dim a() As String
Open "DATAFILE.CSV" For Input As #1 ' 打開檔案。
Do While Not EOF(1) ' 回圈至檔案尾。
Line Input #1, TextLine ' 讀入一行資料并將其賦予某變數。
If TextString = "" Then
TextString = TextLine
Else
TextString = TextString & ";" & TextLine
End If
Loop
Close #1 ' 關閉檔案。
SplitStr = Split(TextString, ";")
m = UBound(SplitStr)
For i = 0 To m
SplitStr2 = Split(SplitStr(i), ",")
n = UBound(SplitStr2)
ReDim a(0 To m, 0 To n)
For j = 0 To n
a(i, j) = SplitStr2(j)
Text1.Text = Text1.Text + a(i, j) & " "
Next j
Text1.Text = Text1.Text & vbCrLf
Next i
End Sub
uj5u.com熱心網友回復:
我已經和你說了。先用一個變數保存,最后一次性設定給文本框,你沒看?
uj5u.com熱心網友回復:
我已經和你說了。先用一個變數保存,最后一次性設定給文本框,你沒看?
哦,哦我看了,
dim i as long dim str as string, r as string dim data() as string, lines() as string open "xxx.csv" for input as #1 str = input(lof(1), 1) close #1 lines = split(str, vbcrlf) for i = lbound(lines) to ubound(lines) data = split(lines(i), ",") if i = lbound(lines) then r = data(0) & " " & data(1) & " " & data(3) & " " & data(4) else r = r & vbcrlf & data(0) & " " & data(1) & " " & data(3) & " " & data(4) end if next text1.text = r
可是總是提示下界越標呀,csv資料量很大的話有影響么??
uj5u.com熱心網友回復:
你除錯下,你選擇的列不對。
uj5u.com熱心網友回復:
好的,十分感謝您的指導,我去試試我做的是一個這樣的東西:csv檔案從intouch中保存生成,所以每次資料都會不一樣,但是列總是28列,行數就不一定了,這28列中前兩列為日期、時間,后面26列是引數列
在vb中,編了26個復選框對應csv中的26個引數,復選框選中哪個,對應將csv讀出并在文本框中顯示那些引數列。最后將這些資料存到excel中。
uj5u.com熱心網友回復:
Open "DATAFILE.CSV" For Input As #1 ' 打開檔案。
Do While Not EOF(1) ' 回圈至檔案尾。
Line Input #1, TextLine ' 讀入一行資料并將其賦予某變數。
If TextString = "" Then
TextString = TextLine
Else
TextString = TextString & ";" & TextLine
End If
Loop
Close #1 ' 關閉檔案。
SplitStr = Split(TextString, ";")
m = UBound(SplitStr)
TextString = ""
For i = 0 To m - 1
SplitStr2 = Split(SplitStr(i), ",")
n = UBound(SplitStr2)
For j = 0 To n - 1
If Check1(j) Then
TextString = TextString.Text & SplitStr2(j) & " "
End If
Next j
TextString = TextString & vbCrLf
Next i
Text1 = TextString
uj5u.com熱心網友回復:
發了幾個貼子,全是這個問題的。
uj5u.com熱心網友回復:
我不太明白的是,樓主為什么要把文本一行行連接起來,再拆分。當檔案很長時,不斷連接字串系統就要重新分配變數快取,這個程序會很慢。
如果我來做,會每輸入一行,就賦給顯示控制元件。字串操作是最慢的,盡量避免不必要的字串操作。
Open "DATAFILE.CSV" For Input As #1 ' 打開檔案。
Do While Not EOF(1) ' 回圈至檔案尾。
Line Input #1, TextLine ' 讀入一行資料并將其賦予某變數。
TextLine = Replace(TextLine, ",", " ")
Text1 = Text1 & TextLine & vbCrlf
Loop
Close #1 ' 關閉檔案。
uj5u.com熱心網友回復:
我不太明白的是,樓主為什么要把文本一行行連接起來,再拆分。當檔案很長時,不斷連接字串系統就要重新分配變數快取,這個程序會很慢。
如果我來做,會每輸入一行,就賦給顯示控制元件。字串操作是最慢的,盡量避免不必要的字串操作。
因為每行資料中會有固定的第幾個是不需要的,這樣就完全把所有資料全部寫進去了
uj5u.com熱心網友回復:
那也不需要把所有的行連接在一起呀。每一行拆分不久行了?
uj5u.com熱心網友回復:
看另一個帖子給你回的代碼。盡量避免長字串的反復連接。
uj5u.com熱心網友回復:
在回圈中直接操作Text控制元件顯示,也是很慢的。應該是在回圈中,每讀取一行,就拆分內容,并把需要的內容提取出來,用String型別變數連接和保存。
這個操作完成后,一次性的賦值給Text控制元件。
uj5u.com熱心網友回復:
十分謝謝各位的指導,我試一試,uj5u.com熱心網友回復:
從你的程式看是把,替換成空格吧?如果是沒必要想你這樣大動干戈!Dim FileFree As Long
Dim ReadFile As String
FileFree = FreeFile
Open FileName For Input As #FileFree
ReadFile = StrConv(InputB(LOF(FileFree), #FileFree), vbUnicode)
Close #FileFree
ReadFile=Replace(ReadFile,","," ")
Text1.Text=ReadFile
uj5u.com熱心網友回復:
聽說ADO可以直接連接.csv檔案。uj5u.com熱心網友回復:
這個ODBC直接支持CSV的,不用人工分解'┏〓〓〓〓〓〓〓〓〓 opentxtcsv,start 〓〓〓〓〓〓〓〓〓┓
'[簡介]:
'打開文本檔案等
Function opentxtcsv(sql)
'VB原始碼,幫你寫函式,幫你寫代碼,幫你寫模塊,幫你設計軟體
'--需要什么函式或功能,可以聯系我。
'著作權所有,請保留作者資訊.Email:[email protected]
'如需商業用途請聯系作者
'sql="select * from e:\a.csv"
Dim conn, sql, rs
Set conn = CreateObject("adodb.connection")
conn.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq="
Set rs = CreateObject("adodb.recordSet")
rs.Open sql, conn, 1, 3
End Function
'┗〓〓〓〓〓〓〓〓〓 opentxtcsv,end 〓〓〓〓〓〓〓〓〓┛
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/122867.html
標籤:資源
上一篇:求VB6.0企業版下載
下一篇:怎樣用vb做課程表
