我需要规则数据中第二列的内容,但不知道每段有多少数据,一共有多少段这样的数据,而且每一段一段读取放入数组。
cm BT前的数据即为下面的行数;但这样的段数无法确定。
8 6 6 11 15 39 96    22      1    1.720   -0.720  294.890   22.390 
-0.52    -0.42     0.00     0.00     0.00     0.00     0.00     0.00     1.51     1.28     1.51     1.37 
0.00         0.00         0.00         0.00         0.00
30000.0000000 30000.0000000 -32768   -32768          0.0
0.0           0.0           0.0           0.0           6.0           0.0           5.0  0.38   0.98
8 cm BT dB 0.43  0.274
  0.38     78.55    131.69   58.7  -52.2    3.9  -22.3   93.6   94.0   90.6   93.2  100       0.00
  0.53     50.59    106.94   48.4  -14.7    0.2   -5.3   95.4   95.8   92.0   93.7  100       0.00
  0.68     38.34     99.15   37.8   -6.1    0.4    8.9   94.2   94.2   94.6   93.3  100       0.00
  0.83     42.23    112.58   39.0  -16.2   -4.4  -12.7   93.4   94.3   94.3   93.0  100       0.00
  0.98     25.19    106.21   24.2   -7.0   -2.3  -13.2   91.8   93.1   92.2   92.2  100       0.00
  1.13    -32768    -32768 -32768 -32768 -32768 -32768   92.7  114.7   90.2  110.0    0 2147483647
  1.28      9.13    337.67   -3.5    8.4   -1.6   58.4  114.8    255  111.8  113.9  100 2147483647
  1.43    -32768    -32768 -32768 -32768 -32768 -32768  115.3    255  112.7    255    0 2147483647
8 6 6 11 15 41 58    23      1    1.740   -0.710  294.650   22.400 
-0.21    -0.45     0.10    -0.10     0.00     0.00     0.00     0.00     1.51     1.28     1.51     1.38 
0.01         1.62        -0.01        -0.00         0.01
30000.0000000 30000.0000000 -32768   -32768          0.0
0.0           0.0           0.0           0.0           6.0           0.0           5.0  0.38   0.98
38 cm BT dB 0.43  0.274
  0.38     26.89    107.82   25.6   -8.2   -4.4   10.7   92.3   93.6   91.0   92.3  100       0.00
  0.53     38.28    125.49   31.2  -22.2   -0.2   -8.0   93.7   94.1   91.1   92.8  100       0.00
  0.68     58.10    114.75   52.8  -24.3   -2.9   -2.6   93.3   95.1   91.2   92.5  100       0.00
  0.83     26.05    125.27   21.3  -15.0    1.2  -25.4   92.6   95.2   93.4   92.1  100       0.00
  0.98     28.04    120.38   24.2  -14.2    3.0   -2.3   94.4   95.2   91.4   91.8  100       0.00
  1.13    -32768    -32768 -32768 -32768 -32768 -32768   92.3  115.1   90.2  108.7    0 2147483647
  1.28     58.23    103.36   56.7  -13.5    5.1  -42.5  114.4    255  111.8  114.4  100 2147483647
  1.43    -32768    -32768 -32768 -32768 -32768 -32768  114.5    255  112.7    255    0 2147483647

解决方案 »

  1.   

    我需要规则数据中第二列的内容,但不知道每段有多少数据,一共有多少段这样的数据,而且每一段一段读取,挑选每一段的最大值,然后挑选总段数的最大值。 
    cm BT前的数据即为下面的行数;但这样的段数无法确定。
      

  2.   

     第二部分规则数据cm bt前数据应为8,不好意思弄错了。
    还有就是这部分规则数据在文本格式是完全对齐的。
     8 cm BT dB 0.43  0.274 
      0.38    26.89    107.82  25.6  -8.2  -4.4  10.7  92.3  93.6  91.0  92.3  100      0.00 
      0.53    38.28    125.49  31.2  -22.2  -0.2  -8.0  93.7  94.1  91.1  92.8  100      0.00 
      0.68    58.10    114.75  52.8  -24.3  -2.9  -2.6  93.3  95.1  91.2  92.5  100      0.00 
      0.83    26.05    125.27  21.3  -15.0    1.2  -25.4  92.6  95.2  93.4  92.1  100      0.00 
      0.98    28.04    120.38  24.2  -14.2    3.0  -2.3  94.4  95.2  91.4  91.8  100      0.00 
      1.13    -32768    -32768 -32768 -32768 -32768 -32768  92.3  115.1  90.2  108.7    0 2147483647 
      1.28    58.23    103.36  56.7  -13.5    5.1  -42.5  114.4    255  111.8  114.4  100 2147483647 
      1.43    -32768    -32768 -32768 -32768 -32768 -32768  114.5    255  112.7    255    0 2147483647
      

  3.   

    不好意思,没表达清楚。
    我是要这部分的最大值,第二列指(26.89、38.28、58.10、26.05、28.04等等),然后再在所有这样的数据内挑选最大值。
      0.38    26.89    107.82  25.6  -8.2  -4.4  10.7  92.3  93.6  91.0  92.3  100      0.00 
      0.53    38.28    125.49  31.2  -22.2  -0.2  -8.0  93.7  94.1  91.1  92.8  100      0.00 
      0.68    58.10    114.75  52.8  -24.3  -2.9  -2.6  93.3  95.1  91.2  92.5  100      0.00 
      0.83    26.05    125.27  21.3  -15.0    1.2  -25.4  92.6  95.2  93.4  92.1  100      0.00 
      0.98    28.04    120.38  24.2  -14.2    3.0  -2.3  94.4  95.2  91.4  91.8  100      0.00 
      1.13    -32768    -32768 -32768 -32768 -32768 -32768  92.3  115.1  90.2  108.7    0 2147483647 
      1.28    58.23    103.36  56.7  -13.5    5.1  -42.5  114.4    255  111.8  114.4  100 2147483647 
      1.43    -32768    -32768 -32768 -32768 -32768 -32768  114.5    255  112.7    255    0 2147483647
    上面这部分规则数据前每一段都有下面一段数据,这部分数据有其他用处。
    8 6 6 11 15 39 96    22      1    1.720  -0.720  294.890  22.390 
    -0.52    -0.42    0.00    0.00    0.00    0.00    0.00    0.00    1.51    1.28    1.51    1.37 
    0.00        0.00        0.00        0.00        0.00 
    30000.0000000 30000.0000000 -32768  -32768          0.0 
    0.0          0.0          0.0          0.0          6.0          0.0          5.0  0.38  0.98 
    8 cm BT dB 0.43  0.274 
      

  4.   

    你的数据一点都没有规律.
    有时一个数一个数之间是一个空格,有的是二个空格,有的是三个空格,有的是四个空格.
    我给一个方法,你自己去弄吧.
    我将我的方法,做几个示例给你.你先将你的数据复制至一个文本框中,再将Text1.MultiLine = True
     Dim DataArr(1000)  '设置一个数组,分别保存每一行的数据
    '*************************************
       '目的:按某个分隔符将文本分离成数组
       
       '输入: Text 要分离的字符串
       '      Sige 分隔符
       '      Arr  数组   分离后的字符以此数组返回
       
       '返回: 成功 True
       '      失败 False
       
    '*************************************Public Function strApart(ByVal Text As String, ByVal Sige As String, Arr) As Boolean
      On Error GoTo strApartErr
      
      Dim strBegin
      Dim Count As Long
      
      strApart = True
      strBegin = 1
      Count = 0
      
      For i = 1 To Len(Text)
        If Mid(Text, i, Len(Sige)) = Sige Then
           Count = Count + 1
           Arr(Count) = Mid(Text, strBegin, i - strBegin)
           strBegin = i + 1
        End If
      Next
      
      If Len(Text) <> strBegin - 1 Then
          Count = Count + 1
          Arr(Count) = Mid(Text, strBegin)
      End If
      
      Arr(0) = Count
      
      Exit Function
      
    strApartErr:
       Err.Clear
       strApart = False
    End Function
    Private Sub Command1_Click()
      strApart Text1.Text, Chr(13), DataArr   '调用方法
      'Data(0) 他的值是你的文本的总行数
      'Data(1) 他的值是你的文本第一行的数据
      'Data(2) 他的值是你的文本第二行的数据
      '......
      'Data(n) 他的值是你的文本第N行的数据
    End Sub
    '因为你的数据有时一个数一个数之间是一个空格,有的是二个空格,有的是三个空格,有的是四个空格.
    '所以我用 strApart Text1.Text, "",DataArr  没有办法分离了.因为 "", " ","  "\都不一样.
      

  5.   

    split函数应该比较适合你的需要,你自己根据情况编写一下
      

  6.   

    这样子是不是太麻烦?
    我有一个思路,可是不会把他变成语言
    先trim(),然后在do while内用replace将两个空格替换成一个,再split
    但这样我只会读取一段,
    那么多段怎么一组一组读取呢?
      

  7.   

    以下列出第二列的数据,怎么找最大值最小值,不用我教了吧!Private DataArr(1000) As String '保存每一行的数据
    Private SubArr(100) As String  '保存第一行分离后的每一列数据
    Private ParaCount As Long '保存段落总数
    Private RowCount(100) As Long '保存每一段落的行数
    Private RowData2(100, 100) '保存每一段第二列的数据'*************************************
       '目的:按某个分隔符将文本分离成数组
       
       '输入: Text 要分离的字符串
       '      Sige 分隔符
       '      Arr  数组   分离后的字符以此数组返回
       
       '返回: 成功 True
       '      失败 False
       
    '*************************************Public Function strApart(ByVal Text As String, ByVal Sige As String, Arr) As Boolean
      On Error GoTo strApartErr
      
      Dim strBegin
      Dim Count As Long
      
      strApart = True
      strBegin = 1
      Count = 0
      
      For i = 1 To Len(Text)
        If Mid(Text, i, Len(Sige)) = Sige Then
           Count = Count + 1
           Arr(Count) = Mid(Text, strBegin, i - strBegin)
           strBegin = i + 1
        End If
      Next
      
      If Len(Text) <> strBegin - 1 Then
          Count = Count + 1
          Arr(Count) = Mid(Text, strBegin)
      End If
      
      Arr(0) = Count
      
      Exit Function
      
    strApartErr:
       Err.Clear
       strApart = False
    End Function
    Private Function Merger(ByVal Text As String, ByVal Sige As String) As String
       Dim isBol As Boolean
        For i = 1 To Len(Text)
          If Mid(Text, i, Len(Sige)) <> Sige Then
            Merger = Merger & Mid(Text, i, Len(Sige))
            isBol = False
          Else
            If isBol = False Then
               Merger = Merger & Mid(Text, i, Len(Sige))
            End If
            isBol = True
          End If
        Next
    End FunctionPrivate Sub Command1_Click()
       strApart Text1.Text, Chr(13), DataArr
       For i = 1 To DataArr(0)
           strApart Merger(DataArr(i), " "), " ", SubArr '对每一行进行分离
           If SubArr(2) = "cm" And SubArr(3) = "BT" Then  '找到每一段的起始行
               ParaCount = ParaCount + 1                  '保存段落数
               RowCount(ParaCount) = SubArr(1)            '保存每一段落的行数
               If i + RowCount(ParaCount) > DataArr(0) Then
                  MsgBox "数据不全! 最后一段应该有" & SubArr(1) & "行,实际只有" & DataArr(0) - i & "行.对最后一段数据将进行调整."
                  RowCount(ParaCount) = DataArr(0) - i
               End If
               For j = i + 1 To i + RowCount(ParaCount)
                  strApart Merger(DataArr(j), " "), " ", SubArr
                  RowData2(ParaCount, j - i) = SubArr(3)
               Next
           End If
       Next
       
       For i = 1 To ParaCount   '这里面就是列出所有第二列的数据
         For j = 1 To RowCount(i)
           MsgBox RowData2(i, j)
         Next
       Next
    End Sub
      

  8.   

    以下程序经测试,结果正确。
    Option Explicit
    Const BUFFERSIZE = 100 '你的段落数量能够估计个上限吗,这里我偷个懒用固定数组了。
    Dim arrMax(1 To BUFFERSIZE) As Single '存放各段落中的最大值,所有段落中的最大值麻烦你自己写程序从这个数组中取出Public Sub Main()
        Dim I As Integer
        Call GetField
        For I = 1 To BUFFERSIZE
            Debug.Print arrMax(I)
        Next I
    End SubPublic Sub GetField()
        Dim strLine As String
        Dim intRowCount As Integer
        Dim intRow As Integer
        Dim sngFieldValue As Single
        Dim arrFields() As String
        Dim I As Integer
        Dim intFieldCount As Integer
        Dim intParagraph As Integer
        
        Open App.Path & "\DATA.TXT" For Input As #1
        
        Do Until EOF(1)
            
            Line Input #1, strLine
        
            '发现段落开始
            If InStr(strLine, "cm") Then
                intParagraph = intParagraph + 1 '给段落编个号
                intRowCount = Val(Split(strLine, , 1)(0)) '取出本段落总行数
                For intRow = 1 To intRowCount '依次读各行
                    Line Input #1, strLine
                    '将一行分割放入数组中
                    arrFields = Split(strLine)
                    '找出第二列的值
                    intFieldCount = 0
                    For I = 0 To UBound(arrFields)
                        If arrFields(I) <> "" Then
                            intFieldCount = intFieldCount + 1
                            If intFieldCount = 2 Then '哈,第二列,we got it!
                                sngFieldValue = Val(arrFields(I))
                                Exit For
                            End If
                        End If
                    Next I
                    '将本段落的最大值存入数组中
                    If arrMax(intParagraph) < sngFieldValue Then
                        arrMax(intParagraph) = sngFieldValue
                    End If
                Next intRow
            End If
        Loop
        
        Close #1End Sub
      

  9.   

    12楼,你将楼主的文本放入Txt文件中,保存,再运行你的代码看一下.
    我不知那里有问题.但是出来的结果不对.
    我说是楼主的文本
    也就是下面的,你复制试一下.8 6 6 11 15 39 96    22      1    1.720  -0.720  294.890  22.390 
    -0.52    -0.42    0.00    0.00    0.00    0.00    0.00    0.00    1.51    1.28    1.51    1.37 
    0.00        0.00        0.00        0.00        0.00 
    30000.0000000 30000.0000000 -32768  -32768          0.0 
    0.0          0.0          0.0          0.0          6.0          0.0          5.0  0.38  0.98 
    8 cm BT dB 0.43  0.274 
      0.38    78.55    131.69  58.7  -52.2    3.9  -22.3  93.6  94.0  90.6  93.2  100      0.00 
      0.53    50.59    106.94  48.4  -14.7    0.2  -5.3  95.4  95.8  92.0  93.7  100      0.00 
      0.68    38.34    99.15  37.8  -6.1    0.4    8.9  94.2  94.2  94.6  93.3  100      0.00 
      0.83    42.23    112.58  39.0  -16.2  -4.4  -12.7  93.4  94.3  94.3  93.0  100      0.00 
      0.98    25.19    106.21  24.2  -7.0  -2.3  -13.2  91.8  93.1  92.2  92.2  100      0.00 
      1.13    -32768    -32768 -32768 -32768 -32768 -32768  92.7  114.7  90.2  110.0    0 2147483647 
      1.28      9.13    337.67  -3.5    8.4  -1.6  58.4  114.8    255  111.8  113.9  100 2147483647 
      1.43    -32768    -32768 -32768 -32768 -32768 -32768  115.3    255  112.7    255    0 2147483647 
    8 6 6 11 15 41 58    23      1    1.740  -0.710  294.650  22.400 
    -0.21    -0.45    0.10    -0.10    0.00    0.00    0.00    0.00    1.51    1.28    1.51    1.38 
    0.01        1.62        -0.01        -0.00        0.01 
    30000.0000000 30000.0000000 -32768  -32768          0.0 
    0.0          0.0          0.0          0.0          6.0          0.0          5.0  0.38  0.98 
    38 cm BT dB 0.43  0.274 
      0.38    26.89    107.82  25.6  -8.2  -4.4  10.7  92.3  93.6  91.0  92.3  100      0.00 
      0.53    38.28    125.49  31.2  -22.2  -0.2  -8.0  93.7  94.1  91.1  92.8  100      0.00 
      0.68    58.10    114.75  52.8  -24.3  -2.9  -2.6  93.3  95.1  91.2  92.5  100      0.00 
      0.83    26.05    125.27  21.3  -15.0    1.2  -25.4  92.6  95.2  93.4  92.1  100      0.00 
      0.98    28.04    120.38  24.2  -14.2    3.0  -2.3  94.4  95.2  91.4  91.8  100      0.00 
      1.13    -32768    -32768 -32768 -32768 -32768 -32768  92.3  115.1  90.2  108.7    0 2147483647 
      1.28    58.23    103.36  56.7  -13.5    5.1  -42.5  114.4    255  111.8  114.4  100 2147483647 
      1.43    -32768    -32768 -32768 -32768 -32768 -32768  114.5    255  112.7    255    0 2147483647
      

  10.   

    Private Sub Command1_Click()
        Dim arr() As String
        Dim s As String
        Dim i As Long, j As Long
        Dim x As Double, y As Double, z As Double
        Open "f:\1.txt" For Input As #1
        z = 1
        Do
            Line Input #1, s
        Loop While InStr(s, "cm") = 0
        
        Do While Not EOF(1)
        
            i = 0
            Do While Not EOF(1) '此循环找到一段数据
                Line Input #1, s
                s = Trim(s) '去掉前导空格
                s = Replace(s, vbTab, " ") '替换掉可能存在的tab符
                Do While InStr(s, "  ") <> 0 '将数据整理成以一个空格分隔
                    s = Replace(s, "  ", " ")
                Loop
                i = i + 1
                ReDim Preserve arr(1 To i) As String
                arr(i) = s
                If InStr(s, "cm") <> 0 Then
                    ReDim Preserve arr(1 To i - 6) As String '这里假设不规则的数据行数固定为6行
                    Exit Do
                End If
            Loop
            j = j + 1
            
            y = CDbl(Split(arr(1), " ")(1))
            For i = 2 To UBound(arr) '循环找到本段最大值
                x = CDbl(Split(arr(i), " ")(1))
                If y < x Then
                    y = x
                End If
            Next
            
            If j = 1 Then
                z = y
            ElseIf z < y Then
                z = y
            End If
            Debug.Print "第" & CStr(j) & "段最大值:" & CStr(y)
        Loop
        Debug.Print "所有段最大值:" & CStr(z)    Close 1
    End Sub
      

  11.   

    如果1000~2000定义个数组还是可行的,如果是几十万,还是把结果存到一个随机文件中比较好(比顺序文件快),不过在测试中为了验证方便,我先给出用顺序文件的办法:Option Explicit
    'Const BUFFERSIZE = 100 '你的段落数量能够估计个上限吗,这里我偷个懒用固定数组了。
    'Dim arrMax(1 To BUFFERSIZE) As Single '存放各段落中的最大值,所有段落中的最大值麻烦你自己写程序从这个数组中取出Public Sub Main()
        'Dim I As Integer
        Call GetField
        'For I = 1 To BUFFERSIZE
        '    Debug.Print arrMax(I)
        'Next I
    End SubPublic Sub GetField()
        Dim strLine As String
        Dim intRowCount As Integer
        Dim intRow As Integer
        Dim sngFieldValue As Single
        Dim sngMax As Single
        Dim arrFields() As String
        Dim I As Integer
        Dim intFieldCount As Integer
        Dim intParagraph As Integer
        
        Open App.Path & "\DATA.TXT" For Input As #1
        Open App.Path & "\RESULT.TXT" For Append As #2
        
        Do Until EOF(1)
            
            Line Input #1, strLine
        
            '发现段落开始
            If InStr(strLine, "cm") Then
                intParagraph = intParagraph + 1 '给段落编个号
                intRowCount = Val(Split(strLine, , 1)(0)) '取出本段落总行数
                For intRow = 1 To intRowCount '依次读各行
                    Line Input #1, strLine
                    '将一行分割放入数组中
                    arrFields = Split(strLine)
                    '找出第二列的值
                    intFieldCount = 0
                    For I = 0 To UBound(arrFields)
                        If arrFields(I) <> "" Then
                            intFieldCount = intFieldCount + 1
                            If intFieldCount = 2 Then '哈,第二列,we got it!
                                sngFieldValue = Val(arrFields(I))
                                Exit For
                            End If
                        End If
                    Next I
                    '将本段落的最大值存入数组中
                    If intRow = 1 Then
                        sngMax = sngFieldValue
                    ElseIf sngMax < sngFieldValue Then
                        sngMax = sngFieldValue
                    End If
                Next intRow
                Write #2, sngMax
            End If
        Loop
        
        Close #1
        Close #2End Sub
    另外,如果对速度要求很高的话,强烈建议楼主用c/c++或者perl。
      

  12.   

    "cm BT前的数据即为下面的行数"
    ---------------------------------
    原来还有这句话,哈哈,那简单很多了
      

  13.   


    '建立一个类.以下代码在类中 我建立的类名为Class1
    Private Type curData
       cRow As Long
       cColumn As Long
       Item As String
    End Type
    Private DataArr() As String
    Private SubArr() As String
    Private IsSet As Boolean
    Private m_ParaCount  As Long
    Private m_RowCount() As Long
    Private m_RowData(1000, 100, 50) As String
    '*************************************
       '目的:按某个分隔符将文本分离成数组
       
       '输入: Text 要分离的字符串
       '      Sige 分隔符
       '      Arr  数组   分离后的字符以此数组返回
       
       '返回: 成功 True
       '      失败 False
       
    '*************************************Private Function strApart(ByVal Text As String, ByVal Sige As String, Arr) As Boolean
      On Error GoTo strApartErr
      
      Dim strBegin
      Dim Count As Long
      
      strApart = True
      strBegin = 1
      Count = 0
      
      For i = 1 To Len(Text)
        If Mid(Text, i, Len(Sige)) = Sige Then
           Count = Count + 1
           ReDim Preserve Arr(Count)
           Arr(Count) = Mid(Text, strBegin, i - strBegin)
           strBegin = i + 1
        End If
      Next
      
      If Len(Text) <> strBegin - 1 Then
          Count = Count + 1
          ReDim Preserve Arr(Count)
          Arr(Count) = Mid(Text, strBegin)
      End If
      
      Arr(0) = Count
      
      Exit Function
      
    strApartErr:
       Err.Clear
       strApart = False
    End Function
    Private Function Merger(ByVal Text As String, ByVal Sige As String) As String
       Dim isBol As Boolean
        For i = 1 To Len(Text)
          If Mid(Text, i, Len(Sige)) <> Sige Then
            Merger = Merger & Mid(Text, i, Len(Sige))
            isBol = False
          Else
            If isBol = False Then
               Merger = Merger & Mid(Text, i, Len(Sige))
            End If
            isBol = True
          End If
        Next
    End Function
    Public Function SetText(ByVal FileName As String, ByVal Txt As Object)
      IsSet = True
      Set RichTxt = Txt
      RichTxt.FileName = FileName
      strApart Txt.Text, Chr(13), DataArr
      For i = 1 To DataArr(0)
         strApart Merger(DataArr(i), " "), " ", SubArr
         If SubArr(2) = "cm" And SubArr(3) = "BT" Then  '找到每一段的起始行
           m_ParaCount = m_ParaCount + 1
           ReDim Preserve m_RowCount(m_ParaCount)
           m_RowCount(m_ParaCount) = SubArr(1)
           If i + m_RowCount(m_ParaCount) > DataArr(0) Then
              MsgBox "数据不全! 最后一段应该有" & SubArr(1) & "行,实际只有" & DataArr(0) - i & "行.对最后一段数据将进行调整."
              m_RowCount(m_ParaCount) = DataArr(0) - i
           End If
           For j = i + 1 To i + RowCount(ParaCount)
              strApart Merger(DataArr(j), " "), " ", SubArr
              For m = 1 To SubArr(0) - 1
                 m_RowData(m_ParaCount, j - i, m) = SubArr(m + 1)
              Next
           Next
           End If
      Next
      
    End FunctionPublic Property Get txtRowCount() As Long  '返回文本总行数
      If IsSet Then
        txtRowCount = DataArr(0)
      End If
    End Property
    Public Property Get ParaCount() As Long   '返回段落数
      If IsSet Then
        ParaCount = m_ParaCount
      End If
    End Property
    Public Property Get RowCount(ByVal paraIndex As Long) As Long    '返某段落的总行数
      If IsSet Then
        If paraIndex < 1 Or paraIndex > m_ParaCount Then Exit Property
        RowCount = m_RowCount(paraIndex)
      End If
    End Property
    Public Property Get RowData(ByVal paraIndex As Long, ByVal RowIndex As Long, ColumnIndex As Long) As String    '返某段落某行某列的内容
      If IsSet Then
        If paraIndex < 1 Or paraIndex > m_ParaCount Then Exit Property
        If RowIndex < 1 Or RowIndex > m_RowCount(paraIndex) Then Exit Property
        RowData = m_RowData(paraIndex, RowIndex, ColumnIndex)
      End If
    End Property
    '以下代码在窗体中.
    '在窗体中放一个RichText控件.Visible属性为False
    Dim NewTxt As New Class1Private Sub Command1_Click()
    NewTxt.SetText "C:\data.txt", RichTextBox1MsgBox NewTxt.RowData(1, 1, 2)  '显示第一段,第一行,第二列的数据
    MsgBox NewTxt.ParaCount '显示总段落数
    MsgBox NewTxt.RowCount(1)  '显示第一段落的行数
    MsgBox NewTxt.txtRowCount '显示文本的总行数
    End Sub
      

  14.   

    还用textboxk控件吗?
    干嘛多这一步呢?
      

  15.   

    我再改了一下类里面的.上面的没有返回行的列数,现在增加:'类里面代码:Private DataArr() As String
    Private SubArr() As String
    Private IsSet As Boolean
    Private m_ParaCount  As Long
    Private m_RowCount() As Long
    Private m_ColumnCount(1000, 100) As Long
    Private m_RowData(1000, 100, 50) As String
    '*************************************
       '目的:按某个分隔符将文本分离成数组
       
       '输入: Text 要分离的字符串
       '      Sige 分隔符
       '      Arr  数组   分离后的字符以此数组返回
       
       '返回: 成功 True
       '      失败 False
       
    '*************************************Private Function strApart(ByVal Text As String, ByVal Sige As String, Arr) As Boolean
      On Error GoTo strApartErr
      
      Dim strBegin
      Dim Count As Long
      
      strApart = True
      strBegin = 1
      Count = 0
      
      For i = 1 To Len(Text)
        If Mid(Text, i, Len(Sige)) = Sige Then
           Count = Count + 1
           ReDim Preserve Arr(Count)
           Arr(Count) = Mid(Text, strBegin, i - strBegin)
           strBegin = i + 1
        End If
      Next
      
      If Len(Text) <> strBegin - 1 Then
          Count = Count + 1
          ReDim Preserve Arr(Count)
          Arr(Count) = Mid(Text, strBegin)
      End If
      
      Arr(0) = Count
      
      Exit Function
      
    strApartErr:
       Err.Clear
       strApart = False
    End Function
    Private Function Merger(ByVal Text As String, ByVal Sige As String) As String
       Dim isBol As Boolean
        For i = 1 To Len(Text)
          If Mid(Text, i, Len(Sige)) <> Sige Then
            Merger = Merger & Mid(Text, i, Len(Sige))
            isBol = False
          Else
            If isBol = False Then
               Merger = Merger & Mid(Text, i, Len(Sige))
            End If
            isBol = True
          End If
        Next
    End Function
    Public Function SetText(ByVal FileName As String, ByVal Txt As Object)
      IsSet = True
      Set RichTxt = Txt
      RichTxt.FileName = FileName
      strApart Txt.Text, Chr(13), DataArr
      For i = 1 To DataArr(0)
         strApart Merger(DataArr(i), " "), " ", SubArr
         If SubArr(2) = "cm" And SubArr(3) = "BT" Then  '找到每一段的起始行
           m_ParaCount = m_ParaCount + 1
           ReDim Preserve m_RowCount(m_ParaCount)
           m_RowCount(m_ParaCount) = SubArr(1)
           If i + m_RowCount(m_ParaCount) > DataArr(0) Then
              MsgBox "数据不全! 最后一段应该有" & SubArr(1) & "行,实际只有" & DataArr(0) - i & "行.对最后一段数据将进行调整."
              m_RowCount(m_ParaCount) = DataArr(0) - i
           End If
           For j = i + 1 To i + RowCount(ParaCount)
              strApart Merger(DataArr(j), " "), " ", SubArr
              m_ColumnCount(m_ParaCount, j - i) = SubArr(0)
              For m = 1 To SubArr(0) - 1
                 m_RowData(m_ParaCount, j - i, m) = SubArr(m + 1)
              Next
           Next
           End If
      Next
      
    End FunctionPublic Property Get txtRowCount() As Long  '返回文本总行数
      If IsSet Then
        txtRowCount = DataArr(0)
      End If
    End Property
    Public Property Get ParaCount() As Long   '返回段落数
      If IsSet Then
        ParaCount = m_ParaCount
      End If
    End Property
    Public Property Get RowCount(ByVal paraIndex As Long) As Long    '返某段落的总行数
      If IsSet Then
        If paraIndex < 1 Or paraIndex > m_ParaCount Then Exit Property
        RowCount = m_RowCount(paraIndex)
      End If
    End PropertyPublic Property Get ColumnCount(ByVal paraIndex As Long, ByVal RowIndex As Long) As Long    '返某段落的某行的列数
      If IsSet Then
        If paraIndex < 1 Or paraIndex > m_ParaCount Then Exit Property
        ColumnCount = m_ColumnCount(paraIndex, RowIndex)
      End If
    End PropertyPublic Property Get RowData(ByVal paraIndex As Long, ByVal RowIndex As Long, ByVal ColumnIndex As Long) As String      '返某段落的总行数
      If IsSet Then
        If paraIndex < 1 Or paraIndex > m_ParaCount Then Exit Property
        If RowIndex < 1 Or RowIndex > m_RowCount(paraIndex) Then Exit Property
        RowData = m_RowData(paraIndex, RowIndex, ColumnIndex)
      End If
    End Property'窗口里面代码
    Dim NewTxt As New Class1Private Sub Command1_Click()
    NewTxt.SetText "C:\data.txt", RichTextBox1
    '下面是列出每一段落,每一行,每一列的数据
    For i = 1 To NewTxt.ParaCount
       For j = 1 To NewTxt.RowCount(i)
          For m = 1 To NewTxt.ColumnCount(i, j)
            MsgBox "第" & i & "段" & "第" & j & "行" & "第" & m & "列的数据是:" & NewTxt.RowData(i, j, m)
          Next
       Next
    Next
    End Sub
      

  16.   

    我的程序,你需要把你的文本文件名改为DATA.TXT,放到程序的目录下,建一个module,把程序贴进去,
    工程启动设置为sub main ,结果在RESULT.TXT文件中
      

  17.   

    可能你的原始数据不完整,导致超出文件尾,程序中断,后续结果当然没能写入RESULT.TXT文件了。
      

  18.   


    恩,是的,38忘记改过来了。但是这句是不太准确的,
    '发现段落开始
            If InStr(strLine, "cm") Then
    因为这个地方并不一定是cm,
    唯一能确定的是他们的行数,即不规则的为6行,规则的为cm(不确定) 这行前面的数字。
      

  19.   

    InStr这句的用意是看看这一行里是否含有"cm"(并不要求"cm"处于行首),从而识别出一个段落的开始;
    cm(不确定) 这行前面的数字是接下来的语句这样取的:
    intRowCount = Val(Split(strLine, , 1)(0)) '取出本段落总行数
      

  20.   

    是啊,这个地方如果不是cm,而是mm,或者m的时候呢?
    我们的程序是要求通用性的,
    总不能对不同的单位再改源代码的吧。
    不过这样执行起来速度还是比较快的。
    我并不是挑选单个的最大值,我还要挑选连续的N个数的和的最大值。你看这个函数应该怎么放?'取数组中连续N个数的和的最大值
    Private Function GetMax(ByRef arrValue() As Long, ByVal lCount As Long) As Long
        Dim lMaxValue As Long
        Dim lSum As Long
        Dim lFirst As Long
        Dim lSecond As Long
        
        '检查连续个数N是否大于数组长度
        If lCount > UBound(arrValue) Then
            GetMax = 0
            MsgBox "连续个数大于数组长度,不能取值", vbInformation, "提示"
            Exit Function
        End If
        
        For lFirst = 1 To UBound(arrValue) - lCount + 1
            For lSecond = 0 To lCount - 1   '取得连续N个数的合计
                lSum = lSum + arrValue(lSecond + lFirst)
            Next
            
            If lMaxValue < lSum Then    '判断新的合计是否比原来大,以取最大值
                lMaxValue = lSum
            End If
            lSum = 0    '合计清0
        Next
        
        GetMax = lMaxValue
    End Function
      

  21.   

    是啊,这个地方如果不是cm,而是mm,或者m的时候呢? 
    我们的程序是要求通用性的, 
    总不能对不同的单位再改源代码的吧。 
    ========
    这个问题,需要你给出所有的原始数据才可能找出规律,你在帖子中只提到了这么多,所以我给出的代码只能是根据你提供的给出来。当然这些标志性的字符串当然也可以存在ini文件或注册表中,可以设置一个用户界面来修改这些标志性的字符串。至于你的其它问题,我想会有更多的高手为你解答。
      

  22.   

    Option Explicit
    'Const BUFFERSIZE = 100 '你的段落数量能够估计个上限吗,这里我偷个懒用固定数组了。
    'Dim arrMax(1 To BUFFERSIZE) As Single '存放各段落中的最大值,所有段落中的最大值麻烦你自己写程序从这个数组中取出Public Sub Main()
        'Dim I As Integer
        Call GetField
        'For I = 1 To BUFFERSIZE
        '    Debug.Print arrMax(I)
        'Next I
    End SubPublic Sub GetField()
        Dim strLine As String
        Dim intRowCount As Integer
        Dim intRow As Integer
        Dim sngFieldValue As Single
        Dim sngMax As Single
        Dim arrFields() As String
        Dim I As Integer
        Dim intFieldCount As Integer
        Dim intParagraph As Integer
        
        Open App.Path & "\DATA.TXT" For Input As #1
        Open App.Path & "\RESULT.TXT" For Output As #2
        
        Do Until EOF(1)
            
            For I = 1 To 6  '读取六行,但只保留最后一行
                Line Input #1, strLine
            Next I
            '发现段落开始
            'If InStr(strLine, "cm") Then
                intParagraph = intParagraph + 1 '给段落编个号
                intRowCount = Val(Split(strLine, , 1)(0)) '取出本段落总行数
                For intRow = 1 To intRowCount '依次读各行
                    Line Input #1, strLine
                    '将一行分割放入数组中
                    arrFields = Split(strLine)
                    '找出第二列的值
                    intFieldCount = 0
                    For I = 0 To UBound(arrFields)
                        If arrFields(I) <> "" Then
                            intFieldCount = intFieldCount + 1
                            If intFieldCount = 2 Then '哈,第二列,we got it!
                                sngFieldValue = Val(arrFields(I))
                                Exit For
                            End If
                        End If
                    Next I
                    '将本段落的最大值存入数组中
                    If intRow = 1 Then
                        sngMax = sngFieldValue
                    ElseIf sngMax < sngFieldValue Then
                        sngMax = sngFieldValue
                    End If
                Next intRow
                Write #2, sngMax
            'End If
        Loop
        
        Close #1
        Close #2End Sub