读取数据到数组问题

qq41251299 2008-07-13 07:27:10
我需要规则数据中第二列的内容,但不知道每段有多少数据,一共有多少段这样的数据,而且每一段一段读取放入数组。
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
...全文
313 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
qqq41251299 2008-07-17
  • 打赏
  • 举报
回复
没人有更好的办法了吗?
qqq41251299 2008-07-15
  • 打赏
  • 举报
回复
不好意思哦。
论坛升级后,我的帐号就怎么也上不去了
投诉了两天了也没人管。
jacknes009 2008-07-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 pen_sky 的回复:]
split函数应该比较适合你的需要,你自己根据情况编写一下
[/Quote]
fvflove 2008-07-13
  • 打赏
  • 举报
回复
以下列出第二列的数据,怎么找最大值最小值,不用我教了吧!



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 Function

Private 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














qq41251299 2008-07-13
  • 打赏
  • 举报
回复
没人帮忙了吗?
高手周末都不上班吗?
qq41251299 2008-07-13
  • 打赏
  • 举报
回复
这样子是不是太麻烦?
我有一个思路,可是不会把他变成语言
先trim(),然后在do while内用replace将两个空格替换成一个,再split
但这样我只会读取一段,
那么多段怎么一组一组读取呢?
pen_sky 2008-07-13
  • 打赏
  • 举报
回复
split函数应该比较适合你的需要,你自己根据情况编写一下
fvflove 2008-07-13
  • 打赏
  • 举报
回复
你的数据一点都没有规律.
有时一个数一个数之间是一个空格,有的是二个空格,有的是三个空格,有的是四个空格.
我给一个方法,你自己去弄吧.
我将我的方法,做几个示例给你.

你先将你的数据复制至一个文本框中,再将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 没有办法分离了.因为 "", " "," "\都不一样.



qq41251299 2008-07-13
  • 打赏
  • 举报
回复
不好意思,没表达清楚。
我是要这部分的最大值,第二列指(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
fvflove 2008-07-13
  • 打赏
  • 举报
回复
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
这些数据没有用吗?
还是每一段前面都有?
fvflove 2008-07-13
  • 打赏
  • 举报
回复
你是要第二列的数据还是要每段中的最大值还是要所有段中的最大值?
qq41251299 2008-07-13
  • 打赏
  • 举报
回复
第二部分规则数据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
qq41251299 2008-07-13
  • 打赏
  • 举报
回复
我需要规则数据中第二列的内容,但不知道每段有多少数据,一共有多少段这样的数据,而且每一段一段读取,挑选每一段的最大值,然后挑选总段数的最大值。
cm BT前的数据即为下面的行数;但这样的段数无法确定。
捧剑者 2008-07-13
  • 打赏
  • 举报
回复
以上程序按行的位置来定位段落的开始。我已测试过,可以的,你再试试。
捧剑者 2008-07-13
  • 打赏
  • 举报
回复
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 Sub

Public 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 #2

End Sub
捧剑者 2008-07-13
  • 打赏
  • 举报
回复
是啊,这个地方如果不是cm,而是mm,或者m的时候呢?
我们的程序是要求通用性的,
总不能对不同的单位再改源代码的吧。
========
这个问题,需要你给出所有的原始数据才可能找出规律,你在帖子中只提到了这么多,所以我给出的代码只能是根据你提供的给出来。当然这些标志性的字符串当然也可以存在ini文件或注册表中,可以设置一个用户界面来修改这些标志性的字符串。

至于你的其它问题,我想会有更多的高手为你解答。


qq41251299 2008-07-13
  • 打赏
  • 举报
回复
是啊,这个地方如果不是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
捧剑者 2008-07-13
  • 打赏
  • 举报
回复
InStr这句的用意是看看这一行里是否含有"cm"(并不要求"cm"处于行首),从而识别出一个段落的开始;
cm(不确定) 这行前面的数字是接下来的语句这样取的:
intRowCount = Val(Split(strLine, , 1)(0)) '取出本段落总行数
qq41251299 2008-07-13
  • 打赏
  • 举报
回复
我的附件不知道为什么不能传上面来呢?
qq41251299 2008-07-13
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 wangmu7206 的回复:]
引用 31 楼 qq41251299 的回复:
刚刚看了你的程序,运行时显示超出文件尾,还有就是你的只是读了第一部分,并选了最大值,第二部分读了吗?

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

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

7,764

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧