这种方式为什么读取大数据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

解决方案 »

  1.   

    我已经和你说了。先用一个变量保存,最后一次性设置给文本框,你没看? 
    哦,哦我看了,
    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.   

    好的,十分感谢您的指导,我去试试 我做的是一个这样的东西:csv文件从intouch中保存生成,所以每次数据都会不一样,但是列总是28列,行数就不一定了,这28列中前两列为日期、时间,后面26列是参数列
      在vb中,编了26个复选框对应csv中的26个参数,复选框选中哪个,对应将csv读出并在文本框中显示那些参数列。最后将这些数据存到excel中。
      

  3.   

        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
      

  4.   

    我不太明白的是,楼主为什么要把文本一行行连接起来,再拆分。当文件很长时,不断连接字符串系统就要重新分配变量缓存,这个过程会很慢。如果我来做,会每输入一行,就赋给显示控件。字符串操作是最慢的,尽量避免不必要的字符串操作。
        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 ' 关闭文件。
      

  5.   

    在循环中直接操作Text控件显示,也是很慢的。应该是在循环中,每读取一行,就拆分内容,并把需要的内容提取出来,用String类型变量连接和保存。
    这个操作完成后,一次性的赋值给Text控件。
      

  6.   

    从你的程序看是把,替换成空格吧?如果是没必要想你这样大动干戈!
    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
      

  7.   

    听说ADO可以直接连接.csv文件。