标题: 如果將1文本的1組溫度記錄值的最大值找出,并加以判斷
[打印本页]
作者: quan_zhou
时间: 2007-5-12 14:41
标题: 如果將1文本的1組溫度記錄值的最大值找出,并加以判斷
如果將1文本的1組溫度記錄值的最大值找出,并加以判斷如:若大於45,小於90顯示OK,否就顯示NG, 運行環境為 XP SP2,用批處理或VBS腳本能實現這工功能就行了,請大家幫忙看看,我用FOR試了不行,應該是我不會用。
文本內容如下:
--------1.txt---------------
New logging session started at : 04:57:57
Your product Upper Temperature Limit is : 115 C.
04:57:57 | CT : 76 C AT : 0 C
04:58:02 | CT : 76 C AT : 0 C
04:58:07 | CT : 76 C AT : 0 C
04:58:12 | CT : 76 C AT : 0 C
04:58:17 | CT : 76 C AT : 0 C
04:58:22 | CT : 76 C AT : 0 C
04:58:27 | CT : 76 C AT : 0 C
04:58:32 | CT : 76 C AT : 0 C
04:58:37 | CT : 76 C AT : 0 C
04:58:42 | CT : 76 C AT : 0 C
04:58:47 | CT : 76 C AT : 0 C
04:58:52 | CT : 76 C AT : 0 C
04:58:57 | CT : 76 C AT : 0 C
04:59:02 | CT : 76 C AT : 0 C
04:59:07 | CT : 77 C AT : 0 C
04:59:12 | CT : 77 C AT : 0 C
04:59:17 | CT : 83 C AT : 0 C
04:59:22 | CT : 77 C AT : 0 C
04:59:27 | CT : 77 C AT : 0 C
04:59:32 | CT : 77 C AT : 0 C
04:59:37 | CT : 77 C AT : 0 C
04:59:42 | CT : 82 C AT : 0 C
04:59:47 | CT : 78 C AT : 0 C
04:59:52 | CT : 86 C AT : 0 C
04:59:57 | CT : 89 C AT : 0 C
05:00:02 | CT : 90 C AT : 0 C
05:00:07 | CT : 91 C AT : 0 C
05:00:12 | CT : 93 C AT : 0 C
05:00:17 | CT : 93 C AT : 0 C
05:00:22 | CT : 94 C AT : 0 C
05:00:27 | CT : 95 C AT : 0 C
05:00:32 | CT : 95 C AT : 0 C
05:00:37 | CT : 96 C AT : 0 C
05:00:42 | CT : 97 C AT : 0 C
05:00:47 | CT : 97 C AT : 0 C
05:00:52 | CT : 98 C AT : 0 C
05:00:57 | CT : 98 C AT : 0 C
05:01:02 | CT : 99 C AT : 0 C
05:01:07 | CT : 100 C AT : 0 C
05:01:12 | CT : 100 C AT : 0 C
05:01:17 | CT : 102 C AT : 0 C
05:01:22 | CT : 105 C AT : 0 C
05:01:27 | CT : 106 C AT : 0 C
05:01:32 | CT : 108 C AT : 0 C
05:01:37 | CT : 101 C AT : 0 C
05:01:42 | CT : 99 C AT : 0 C
05:01:48 | CT : 101 C AT : 0 C
05:01:53 | CT : 102 C AT : 0 C
05:01:58 | CT : 110 C AT : 0 C
05:02:03 | CT : 112 C AT : 0 C
05:02:08 | CT : 114 C AT : 0 C
05:02:13 | CT : 113 C AT : 0 C
05:02:18 | CT : 114 C AT : 0 C
05:02:23 | CT : 114 C AT : 0 C
05:02:28 | CT : 114 C AT : 0 C
05:02:33 | CT : 116 C AT : 0 C
05:02:38 | CT : 116 C AT : 0 C
05:02:43 | CT : 117 C AT : 0 C
05:02:48 | CT : 118 C AT : 0 C
05:02:53 | CT : 119 C AT : 0 C
-----------------------------------------------------
溫度監測越久,文本內空就越多。
[
Last edited by quan_zhou on 2007-5-12 at 03:44 PM ]
作者: wudixin96
时间: 2007-5-12 15:41
@echo off&setlocal enabledelayedexpansion
set a=0
for /f "tokens=5" %%i in (1.txt) do if %%i GTR !a! set a=%%i
if %a% GTR 45 (goto label) else (echo NG)
:label
if %a% LSS 90 (echo OK) else (echo NG)
pause
试试?
作者: wudixin96
时间: 2007-5-12 15:45
如果文本有
New logging session started at : 04:57:57
Your product Upper Temperature Limit is : 115 C.
应跳过4行.
@echo off&setlocal enabledelayedexpansion
set a=0
for /f "skip=4 tokens=5" %%i in (1.txt) do if %%i GTR !a! set a=%%i
if %a% GTR 45 (goto label) else (echo NG)
:label
if %a% LSS 90 (echo OK) else (echo NG)
pause
作者: quan_zhou
时间: 2007-5-12 16:01
非常感謝wudixin96兄的回復,您的代碼我測試OK,謝謝!
其實我接觸DOS也有好久了,但就沒法深入,真是沒用!
能否幫忙解釋您的代碼呢?
作者: wudixin96
时间: 2007-5-12 16:10
@echo off&setlocal enabledelayedexpansion
set a=0 /*用于存储最大的温度值,并初始化*/
for /f "skip=4 tokens=5" %%i in (1.txt) do if %%i GTR !a! set a=%%i /*skip=4跳过4行. 由于tokens=5.所以%%i中存储的是取到的温度值.可以在cmd里输入for /?来了解一下for的用法*/
if %a% GTR 45 (goto label) else (echo NG)
:label
if %a% LSS 90 (echo OK) else (echo NG)
pause
我不会解释了.我的文字功底很差的.抱歉 ^-^
作者: lxmxn
时间: 2007-5-12 16:15
标题: Try gawk
gawk "/CT/{if($5>45&&$5<90){print \"OK\"} else {print \"NG\" }}" 1.txt
作者: wudixin96
时间: 2007-5-12 16:18
gawk是Linux的东西吗?
作者: zhoushijay
时间: 2007-5-12 16:26
set fso=createobject("scripting.filesystemobject")
set op=fso.opentextfile("1.txt",1)
set d=createobject("scripting.dictionary")
on error resume next
for i=1 to 1000
op.skipline
ln=op.readline
if len(ln)=39 then
t=mid(ln,17,2)
end if
if len(ln)=40 then
t=mid(ln,17,3)
end if
t=int(t)
if err=0 then
d.add i,t
end if
next
for each i in d
if d(i)>b then
mx=d(i)
end if
b=d(i)
next
if mx>45 and mx<90 then
msgbox("Temperature is OK"&chr(10)&"The hotest is "&mx&"C")
else
msgbox("Temperature is NG"&chr(10)&"The hotest is "&mx&"C")
end if
VBS版 ^^!
作者: quan_zhou
时间: 2007-5-12 17:06
TO zhoushijay 兄
您的代碼運行后都會顯"The hotest is* C" 不是文本中的最大溫度值。我試差改變1.TXT中內容試了幾次都是,謝謝大家的回復。
TO wudixin96k 兄
謝謝您的解釋,請問一下您代碼中的GTR 是否是小於、LSS是否是大於的意思? 因為我單獨測試了無效,如:
@echo off
set a=99
if %a% GTR 45 goto min
if %a% LSS 90 goto max
:min
顯示測試小於45
goto end
:max
顯示測試大於90
goto end
:end
作者: zhoushijay
时间: 2007-5-12 17:12
是滴,我也发现问题了,正在努力修复之中
作者: everest79
时间: 2007-5-12 17:14
set /a 1/(var/45)&& set /a 1/(90/var)&& echo %var%
作者: lxmxn
时间: 2007-5-12 17:18
Quote: |
Originally posted by wudixin96 at 2007-5-12 16:18:
gawk是Linux的东西吗? |
|
Linux 只是集成了这个工具,实际上它可以算是个编程语言,专业处理文本的程式语言。gawk是GNU版的awk。
想详细了解awk,可以去这里看看:
http://www.itisedu.com/phrase/200603021801255.html
作者: slore
时间: 2007-5-12 17:22
Set fso
= CreateObject("
Scripting.FileSystemObject"
)
Set op
= fso.
OpenTextFile("
1.txt",1
)
Set d
= CreateObject("
Scripting.Dictionary"
)
on Error Resume Next '尽量少用……
For i
= 1
To 1000
'建议使用AtEndOfStream...这样就不需要上面的错误忽略而且对于大于1000行的文本也可以处理
op.skipline
'下面readline这里为什么要skip?
ln
= op.
ReadLine
If Len(ln
) = 39
Then '以下用len和mid...建议学会用Instr...否则当长度不至2种的时候……
t
= Mid(ln,17,2
)
End If
If Len(ln
) = 40
Then
t
= Mid(ln,17,3
)
End If
t
= Int(t
)
If Err = 0
Then
d.add i,t
'还是老问题,为什么不用数组 d(i)=t,我不觉得用Dictionary对象有什么优势
End If
Next
For Each i
In d
'用的Dictionary,怎么变成数组了,汗~
If d
(i
) > b
Then
mx
= d
(i
)
End If
b
= d
(i
)
Next
If mx
> 45
And mx
< 90
Then
MsgBox("
Temperature is OK"
& Chr(10
) & "
The hotest is "
& mx
& "
C"
) '有常量不用非要用函数。Chr(10)=vbCr
Else
MsgBox("
Temperature is NG"
& Chr(10
) & "
The hotest is "
& mx
& "
C"
) '不需要返回值的时候不要用括号
End If
'--缺少对对象的释放--
Set d
= Nothing
Set op
= Nothing
Set fso
= Nothing
[
Last edited by slore on 2007-5-12 at 05:36 PM ]
作者: lxmxn
时间: 2007-5-12 17:25
标题: 再将6楼的gawk命令改进一下
gawk "BEGIN{max=0}/CT/{if($5>max)max=$5;if($5>45&&$5<90){print \"OK\"} else {print \"NG\" }}END{print \"The max tep is\",max}" 1.txt
作者: wudixin96
时间: 2007-5-12 17:30
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
cmd里输入if /?了解一下?
作者: wudixin96
时间: 2007-5-12 17:34
Quote: |
Originally posted by zhoushijay at 2007-5-12 04:26 PM:
set fso=createobject("scripting.filesystemobject")
set op=fso.opentextfile("1.txt",1)
set d=createobject("scripting.dictionary")
on error resume next
for i=1 to 10 ... |
|
用FOR,好像用while好点。
用op.atendofstream属性循环。
没仔细 看slore的回复。灌水了 。o(∩_∩)o...哈哈
[
Last edited by wudixin96 on 2007-5-12 at 05:38 PM ]
作者: zhoushijay
时间: 2007-5-13 10:56
经过13楼建议,我作了一点修改,不过我还是认为dictionary比较方便,上次错误的主要原因是提取集合中的最大数的算法错误,现在已经改正,并且测试过了.
set fso=createobject("scripting.filesystemobject")
set op=fso.opentextfile("1.txt",1)
set d=createobject("scripting.dictionary")
i=1
do until op.atendofstream=true
ln=op.readline
t=mid(ln,17,3)
on error resume next
t=int(t)
if err=0 then
d.add i,t
end if
i=i+1
loop
mx=0
for each i in d
if d(i)>mx then
mx=d(i)
end if
next
if mx>45 and mx<90 then
msgbox("Temperature is OK"&chr(10)&"The hotest is "&mx&"C")
else
msgbox("Temperature is NG"&chr(10)&"The hotest is "&mx&"C")
end if
[
Last edited by zhoushijay on 2007-5-13 at 12:19 PM ]
作者: slore
时间: 2007-5-13 11:19
t=mid(ln,17,2)
t=mid(ln,17,3)
?这样T不是只有一个?
作者: slore
时间: 2007-5-13 11:24
还好他后面有空格
XX C
XXX C
你取3位。。。“XX ”或者“XXX”经INT后就是XX 和 XXX
作者: zhoushijay
时间: 2007-5-13 12:18
那直接取3位好了
作者: sonicandy
时间: 2007-5-13 18:54
Option Explicit '语法严格
Dim reg,matches,match,file,max,flag,submatch,fso,temp
Set fso = CreateObject("scripting.filesystemobject")'创建FSO对象
Set reg = new regexp '创建正则对象
reg.global = True '全局搜索
reg.ignorecase = True '忽略大小写
reg.pattern = "CT : *([0-9\-]+) +C" '匹配模式字符串(正则表达式)
flag = False '标记是否为第一次循环
Set file = fso.opentextfile("1.txt",1)
If Not file.atendofstream Then '文件不为空
Set matches = reg.execute(file.readall()) '执行搜索
For Each match In matches '遍历所有匹配项
For Each submatch In match.submatches '遍历匹配子项(模式字符串中括号里的内容)
temp = Int(submatch) '转化为正数
Next
If flag=False Then '第一次直接赋值
max = temp
flag = True
ElseIf max<temp Then '以后比较赋值
max = temp
End if
Next
End If
If max>45 And max<90 Then
MsgBox "OK"
Else
MsgBox "NG"
End If
'释放对象
Set reg = Nothing
Set fso = Nothing