我需要规则数据中第二列的内容,但不知道每段有多少数据,一共有多少段这样的数据,而且每一段一段读取放入数组。
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
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
cm BT前的数据即为下面的行数;但这样的段数无法确定。
还有就是这部分规则数据在文本格式是完全对齐的。
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
我是要这部分的最大值,第二列指(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
有时一个数一个数之间是一个空格,有的是二个空格,有的是三个空格,有的是四个空格.
我给一个方法,你自己去弄吧.
我将我的方法,做几个示例给你.你先将你的数据复制至一个文本框中,再将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 没有办法分离了.因为 "", " "," "\都不一样.
我有一个思路,可是不会把他变成语言
先trim(),然后在do while内用replace将两个空格替换成一个,再split
但这样我只会读取一段,
那么多段怎么一组一组读取呢?
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
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
我不知那里有问题.但是出来的结果不对.
我说是楼主的文本
也就是下面的,你复制试一下.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
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
'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。
---------------------------------
原来还有这句话,哈哈,那简单很多了
'建立一个类.以下代码在类中 我建立的类名为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
干嘛多这一步呢?
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
工程启动设置为sub main ,结果在RESULT.TXT文件中
恩,是的,38忘记改过来了。但是这句是不太准确的,
'发现段落开始
If InStr(strLine, "cm") Then
因为这个地方并不一定是cm,
唯一能确定的是他们的行数,即不规则的为6行,规则的为cm(不确定) 这行前面的数字。
cm(不确定) 这行前面的数字是接下来的语句这样取的:
intRowCount = Val(Split(strLine, , 1)(0)) '取出本段落总行数
我们的程序是要求通用性的,
总不能对不同的单位再改源代码的吧。
不过这样执行起来速度还是比较快的。
我并不是挑选单个的最大值,我还要挑选连续的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
我们的程序是要求通用性的,
总不能对不同的单位再改源代码的吧。
========
这个问题,需要你给出所有的原始数据才可能找出规律,你在帖子中只提到了这么多,所以我给出的代码只能是根据你提供的给出来。当然这些标志性的字符串当然也可以存在ini文件或注册表中,可以设置一个用户界面来修改这些标志性的字符串。至于你的其它问题,我想会有更多的高手为你解答。
'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