当前位置:编程学习 > VB >>

vb读取csv

这种方式为什么读取大数据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 我已经和你说了。

先用一个变量保存,最后一次性设置给文本框,你没看? 我已经和你说了。

先用一个变量保存,最后一次性设置给文本框,你没看? 
哦,哦我看了,
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数据量很大的话有影响么??
引用 2 楼 heianzhiwang 的回复:
我已经和你说了。

先用一个变量保存,最后一次性设置给文本框,你没看? 
哦,哦我看了,
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数据量很大的话有影响么??

你调试下,你选择的列不对。 好的,十分感谢您的指导,我去试试 

我做的是一个这样的东西:csv文件从intouch中保存生成,所以每次数据都会不一样,但是列总是28列,行数就不一定了,这28列中前两列为日期、时间,后面26列是参数列
  在vb中,编了26个复选框对应csv中的26个参数,复选框选中哪个,对应将csv读出并在文本框中显示那些参数列。最后将这些数据存到excel中。
    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
发了几个贴子,全是这个问题的。
我不太明白的是,楼主为什么要把文本一行行连接起来,再拆分。

当文件很长时,不断连接字符串系统就要重新分配变量缓存,这个过程会很慢。

如果我来做,会每输入一行,就赋给显示控件。字符串操作是最慢的,尽量避免不必要的字符串操作。
    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 ' 关闭文件。
我不太明白的是,楼主为什么要把文本一行行连接起来,再拆分。

当文件很长时,不断连接字符串系统就要重新分配变量缓存,这个过程会很慢。

如果我来做,会每输入一行,就赋给显示控件。字符串操作是最慢的,尽量避免不必要的字符串操作。

因为每行数据中会有固定的第几个是不需要的,这样就完全把所有数据全部写进去了 那也不需要把所有的行连接在一起呀。

每一行拆分不久行了?
看另一个帖子给你回的代码。

尽量避免长字符串的反复连接。 在循环中直接操作Text控件显示,也是很慢的。

应该是在循环中,每读取一行,就拆分内容,并把需要的内容提取出来,用String类型变量连接和保存。
这个操作完成后,一次性的赋值给Text控件。
十分谢谢各位的指导,我试一试,
补充:VB ,  资源
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,