“"e:\1.dat” 文件大致格式是“    1    2.2    3.33     4.444”,想要调取“1”,循环从第一个空格开始调,如果调出的是空格,则往后顺延一位,直到调出的不是空格,而是“1”。由于是vb初学者,循环语句还没有学好,下面是自己搞出的程序,运行一直都是空白,求大侠们指点。Private Sub Command1_Click()
   Dim lngFn As Long, strT As String
    lngFn = FreeFile
    Open "e:\1.dat" For Binary As #lngFn
    strT = Space(LOF(lngFn))
    Get #1, , strT
    Close #lngFn
    Dim a As Long
    sArr = Split(strT, vbCrLf)
    a = 1
   txt1.Text = Split(sArr(0), " ")(a)
   For a = 1 To 6
   If (txt1.Text = "") Then
    End If
    Next  a
End Sub

解决方案 »

  1.   

    按vbCrLf拆成数组,得到每一行,
    每一行的数据,再按空格,拆成数组。
    数组第一个就是1啊。
      

  2.   

    记得用Trim去掉首尾的空格。
      

  3.   

    Private Sub Command1_Click()
        Dim lngFn As Long, strT As String, sArr() As String, i As Long    lngFn = FreeFile
        Open "e:\1.dat" For Input As #lngFn
        Do Until EOF(lngFn)
            Line Input #lngFn, strT
            
            strT = Trim(strT)
            Do While InStr(strT, Space(2))
                strT = Replace(strT, Space(2), Space(1))
            Loop
            
            sArr = Split(strT, Space(1))
            
            If sArr(0) = "1" Then
                MsgBox "'1' is found."
                Exit Do
            End If
        Loop
        Close #lngFn
    End Sub
      

  4.   


    其实我的数据格式是图片上的这种,因为我想固定调取第二列cloud的数值,但由于有的数占3位,有的占4位,我用
    txt1.Text = Split(sArr(2), " ")(12)时可以调出四位的10.0,但是想要调取三位的9.7,又变成Split(sArr(2), " ")(13)。所以想用循坏语句,从FH列后的第一个空格(txt1.Text = Split(sArr(2), " ")(8))开始调,如果是空格就继续调后一位,如果不是空格就把值赋给txt1.TEXT。求指点~~~~
      

  5.   

            Do While InStr(strT, Space(2)) 
                strT = Replace(strT, Space(2), Space(1)) 
            Loop将连续的多个空格替换为 1 个空格,然后切分。
      

  6.   

    其实我觉得你的这个数据格式可以说是“很规范”了,应该是很好处理的。
    对于读取到的每一行内容 strT:
    Dim strT As String
    Dim CV   As Double   ' CV的类型用String还是Double,按你的需要来定
    Dim p1&, p2 As LongstrT = "xxxxxxxx"    ' strT 的值为每行数据的内容
    p1 = InStr(W, strT, " ")
       ' 这儿W的值,是指第1列数据FH占用的宽度。
       ' 比如第1行数据:0的前面有3空格、再加数值0,共4个字符,W就为4;
       '     因数值后面还有若干空格,W为5、为6也行,但不要“增加太多”。
    p2 = InStr(InStr(p1, strT, "."), strT, " ")
       ' 取第二列 Cloud 的数据:
    CV = Val(Mid$(strT, p1, p2 - p1))         ' 取“数值”值用这句 Double
    CV = LTrim$(Mid$(strT, p1, p2 - p1))      ' 取“文本”值用这句 String
      

  7.   

    6 楼的思路也很好,把文件当作字段固定宽度的记录来处理。其实,若不是为了人工阅读的“美观”,字段间用逗号或制表符(Tab) 分隔,更便于机器处理。甚至可以当作外部数据库,用 ADO 对象来查询。
      

  8.   

    对了,忽然想到,它的这个“记录”都是固定宽度对齐的,那么对于每一个“字段”,
    都可以直接用 Mid$( strT, ps, W) 的形式,把数据“抠出来”,而那几次 Instr()的函数调用是不必要的。
    ps 就是从第几个字符开始,W 就是取多少字符;
    只要大概把文件内容看一下,就可以选择出比较合理的 ps和W 的值,确保不会把每个字段的“有效内容”截掉。
    然后,配合 Trim$() 或Val() 把“抠出来的数据”处理一下就行了:
    如果要“文本结果”就用trim 去掉首尾的空格,如果要“数值结果”就用 Val 转换成数值。
      

  9.   

    这么规整的数据,直接
    trim(mid(行内容变量,起启位置,长度))
    哪列取不出来啊?