VB 计算文件中的数据最大值是否大于设定值、最小值是否小于设定值和是否包含特征值

ajunajun 2017-10-15 11:46:30
计算文件中的数据最大值是否大于设定值、最小值是否小于设定值和是否包含特征值(2个,可能是数字或字符,但不可能是NULL)
一、文件说明:
有多个数据文件,每个文件列数可能不相同(至少有一列),每一列代表一种数据,数据的长度(行数)不是确定值。
比如下面的数据文件有4列,数据内容格式为:数据1+空格+数据2+空格+数据3+空格+数据4+空格
数据文件中每一个NULL代表缺测一个数据(空数据)。
假设数据文件内容如下:
4827.8 1002.27 450.00 9.29
5000.8 1002.27 450.00 9.29
4829.4 1002.28 449.98 9.29
0.0 1002.29 449.99 9.28
1000 1002.29 450.01 9.27
NULL 1002.29 450.02 9.26
NULL 1002.33 450.03 9.26
NULL NULL NULL NULL
4840.7 NULL NULL 9.25
4843.3 NULL 449.99 9.25
NULL 1002.38 450.01 9.25
NULL 1002.38 449.99 9.24
4848.1 NULL 450.02 NULL
NULL 1002.39 450.02 9.23
4853.2 1002.44 450.00 9.22
4855.6 1002.46 450.03 9.22
4857.3 1002.48 450.03 9.22
4861.1 1002.49 450.02 9.22
4862.6 1002.50 450.02 9.22
4863.9 1002.53 450.00 9.21
4866.9 1002.55 449.99 9.21
4868.3 1002.55 449.96 9.20
4870.4 1002.56 449.96 9.20
4872.0 1002.56 449.96 9.19
4875.0 1002.57 449.96 9.18
4877.8 1002.60 449.98 9.18
4879.9 1002.61 449.98 9.17
4882.6 1002.62 450.01 9.17
4884.5 1002.63 449.96 9.16
4886.5 1002.66 450.00 9.16
4890.1 1002.66 450.02 9.15
二、计算说明
每列数据可设置1个最大值、一个最小值和2个特征值(通过4个文本框读取)。可能会设置其中的一个或多个或全部,如果设置了就计算,不设置(空字符)不进行计算,数据为"NULL"时不参与计算.
比如:假设第一列数据设置了一个最大值=5000、一个最小值=3000、特征值1=0、特征值2=9999,特征值不参与计算。其他列同理。
如果第一列数据中有数据>=最大值,则计算其出现的位置,比如上面的数据出现在第2个,输出:"5000.8-2",如果没有>5000的数则返回:"No"或特定字符如"999999"。没有设置直接返回"No"或特定字符。
最小值同理(数据<=最小值),如果没有<3000的数则返回:"No"或特定字符如"999999"。
特征值只计算第一个出现的位置,比如上面的数据出现在第3个(设置的特征值为"0"),输出:"0-3",如果没有出现特征值的数则返回:"No"或特定字符如"999999"。
三、请教问题:
1.最好做成函数或模块,用于调用
2.读取文件之前已经知道该文件包含的列数(但是每个文件的列数又不确定)。比如上面的4列数据返回给4个数组a(i)、b(i)、c(i)、d(i)这里的i=3,每个数组有4个元素比如a(0)表示最大值、a(1)表示最小值、a(2)表示特征值1、a(3)表示特征值2。
a(i)为字符串型,如上面的最大值:a(0)="5000.8-2";最小值:a(1)="1000-4";特征值1:a(2)="0-3"、特征值2:a(3)="No"。
四、其他说明
1.这是以前发的一个类似帖子,bakw大哥帮忙解决的问题,可我实在看不懂,所以不知道用到这个计算上面该怎么改。
http://bbs.csdn.net/topics/392131992
2.从网上找了一个计算最大值最小值的例子,我水平实在太差了,求哪位大神帮帮忙。

Private Sub Command1_Click()
'这里是对产生的10个随机数进行计算
Dim a(10) As Integer
Dim i, j As Integer
Dim max, min As Integer
Dim maxi, minj As Integer
Dim temp As String
Randomize
'产生10个随机数
For i = 1 To 10
a(i) = Int(Rnd() * 100)
Next
max = a(1)
min = a(1)
For i = 2 To 10
'计算最小值及其位置
If min > a(i) Then
minj = i
min = a(i)
End If
'计算最大值及其位置
If max < a(i) Then
maxi = i
max = a(i)
End If
Next
'计算特征值所在位置
Dim k As Integer
Dim ProZhi As Integer
Dim ProLocal As Integer
ProZhi = 23 '这里设置特征值为23
For k = 1 To 10
If ProZhi = a(k) Then
ProLocal = k
End If
Next
For i = 1 To 10
temp = temp & a(i) & " "
Next
temp = "这10个数是:" & temp & "最大数" & max & "的位置在" & maxi & " " & "最小数" & min & "的位置在" & minj & " 特征值" & ProZhi & "的位置在" & ProLocal
Print temp
End Sub
...全文
533 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ajunajun 2017-11-20
  • 打赏
  • 举报
回复
非常抱歉,最近一直在忙别的,都没时间写软件了,感谢!!!
脆皮大雪糕 2017-10-16
  • 打赏
  • 举报
回复
你给的样例数据和你后面的需求描述不符 第一列的最小数是0,在第四行,你的描述是最小数是1000在第四行(其实是第五行) 特征值0在第四行,你描述的是位置为3 如果你的位置是从行号0开始编号的,那么最大值 5000.8位置应该是1 好了按照我的理解给你一段

Option Explicit

Private Sub Command1_Click()
    Dim strDataLine As String       '临时字符串变量,存放读取的一行数据
    Dim aryDataLine() As String       '临时的字符串数组,存放被分解的一行数据
    Dim colDataAll As New Collection '集合,将分解好的一行行数据往里面塞

'--------------数据准备
    Open "B:\test.txt" For Input As #1
    Do While Not EOF(1)
        Line Input #1, strDataLine
        'Debug.Print strDataLine
        aryDataLine = Split(strDataLine, " ")
        colDataAll.Add aryDataLine
    Loop
    Close #1
    
'第一组测试
    Dim aryParam(1 To 4) As Single   '存放最大、最小、两个特征值参数
    Dim aryOutput(1 To 4) As String  '接收输出的数组
'--------------参数准备
    aryParam(1) = 5000:    aryParam(2) = 3000:    aryParam(3) = 0:    aryParam(4) = 9999
'--------------调用,处理第1列
    Call Test(colDataAll, aryParam, 1, aryOutput)
'--------------输出
    Debug.Print "第一列参数:"; aryParam(1), aryParam(2), aryParam(3), aryParam(4)
    Debug.Print "第一列输出:"; aryOutput(1), aryOutput(2), aryOutput(3), aryOutput(4)
    Debug.Print
    
'第二组测试
'--------------参数准备
    aryParam(1) = 1002.5:    aryParam(2) = 1002.49:    aryParam(3) = 1002.66:    aryParam(4) = 1002.55
'--------------输出数组清空
    aryOutput(1) = "": aryOutput(2) = "": aryOutput(3) = "": aryOutput(4) = "":
'--------------调用,处理第2列
    Call Test(colDataAll, aryParam, 2, aryOutput)
'--------------输出
    Debug.Print "第二列参数:"; aryParam(1), aryParam(2), aryParam(3), aryParam(4)
    Debug.Print "第二列输出:"; aryOutput(1), aryOutput(2), aryOutput(3), aryOutput(4)
End Sub


'处理子过程
'colDataIn 按顺序塞入数据的集合
'aryPara 参数数组
'aryout  输出数组
'DataCol 需要处理哪一列数据,从1开始
Private Sub Test(ByVal colDataIn As Collection, ByRef aryPara() As Single, intDataCol As Integer, ByRef aryOut() As String)
    Dim i As Integer
    Dim sglMax As Single, sglMin As Single
    Dim strdata
    sglMax = aryPara(1): sglMin = aryPara(2)
    For i = 1 To colDataIn.Count
        strdata = colDataIn(i)(intDataCol - 1)
        If UCase(strdata) <> "NULL" Then 'null数据不处理
            If Val(strdata) >= aryPara(1) And Val(strdata) > sglMax Then
                sglMax = Val(strdata)
                aryOut(1) = i
            End If
            If Val(strdata) <= aryPara(2) And Val(strdata) < sglMin Then
                sglMin = Val(strdata)
                aryOut(2) = i
            End If
            If Val(strdata) = aryPara(3) And aryOut(3) = "" Then
                aryOut(3) = i
            End If
            If Val(strdata) = aryPara(4) And aryOut(4) = "" Then
                aryOut(4) = i
            End If
        End If
    Next
    If aryOut(1) <> "" Then aryOut(1) = Str(sglMax) & "-" & aryOut(1) Else aryOut(1) = "No"
    If aryOut(2) <> "" Then aryOut(2) = Str(sglMin) & "-" & aryOut(2) Else aryOut(2) = "No"
    If aryOut(3) <> "" Then aryOut(3) = Str(aryPara(3)) & "-" & aryOut(3) Else aryOut(3) = "No"
    If aryOut(4) <> "" Then aryOut(4) = Str(aryPara(4)) & "-" & aryOut(4) Else aryOut(4) = "No"
End Sub

输出结果: 第一列参数: 5000 3000 0 9999 第一列输出: 5000.8-2 0-4 0-4 No 第二列参数: 1002.5 1002.49 1002.66 1002.55 第二列输出: 1002.66-30 1002.27-1 1002.66-30 1002.55-21
of123 2017-10-16
  • 打赏
  • 举报
回复
说一个解决思路吧。 1 读文件
Dim strLine As String, strItem() As String
Open "your-file" For Input As #1
Do Until EOF(1)
    Line Input #1, strLine
    strItem = Split(Trim(strLine), " ")
    ‘在这里处理
Loop
Close #1
每一行读取后,被分成了 n 个字符串。n 就是文件的列数。 2 处理 就是将分隔开的字符串转换成浮点数,与你事先设置的基准值进行比较,然后按照你的规则输出信息。 你的预设值也要事前转换成浮点数。 可以是有条件比较,比如预设值为 NULL 就不执行。

7,765

社区成员

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

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