大神帮帮忙,关于读取TXT,log,问题,
终于注册了账户,想提问还得等两小时,刚接触au3,但是还不会用,我问题是:
想做个小脚本读取每日的log文档,文档内容如下所示,并统计stepx(step:1-60)出现的次数显示出来比如:
Step1(Sleep):10
Step5(Sleep):15
Step9(Sleep):5
Step22(Sleep):13
这样显示结果
文档名是每天按时间变化的,
比如
2016年12月13日是:161213e,
2016年12月14日是:161214e,
2016年12月15日是:161215e,
日期后加“e”
由于基础差,不会用,自己尝试了什么filepoen,什么filereadline,头都大了,各位帮帮忙,小弟感谢
我开始思路是
1.先读取系统时间,读取到年月日,就用时间组成文件名,先是FileExists识别是否存在,不存在就提示错误,有的话就打开文件
2.然后,开始读取每一行,当读到step时,如step48,读取step后的48,那么Step48(sensa_off2):累加1,
又读取第二行,
当读到step时,读取step后的41,那么Step41(MotorA):累加1
又读取第三行,
当读到step时,读取step后的41,那么Step41(MotorA):累加到2
....等
3.最后用创建新的文档或是用msgbox显示出来:
(事先定义了:dim Step1=Step1(Sleep)
dim Step6=Step6(ECU_5v)
....等等)
readresult:
Step1(Sleep):12
..
Step6(ECU_5v):9
..
Step42(MotorB):33..
这样
但是就是不会弄,连FileExists都报错,不会搞
我用C语言思路是fopen打开文件,然后再for循环遍历文件,再逐个累加,再显示,
au3还不熟,请各位帮忙下,
log文档内容如下所示
161212<08:48:21> / Step48(sensa_off2):Result:5
161212<08:49:19>Step41(MotorA):Result:4.597
161212<08:51:48> / Step41(MotorA):Result:4.510
161212<09:00:22>Step6(ECU_5v):Result:0.256
161212<09:01:47>Step41(MotorA):Result:4.597
161212<09:12:28>Step6(ECU_5v):Result:5.220
161212<09:22:38> / Step41(MotorA):Result:4.654
161212<09:56:05> / Step42(MotorB):Result:4.267
161212<10:13:13> / Step42(MotorB):Result:4.225
161212<10:26:29>Step48(sensa_off2):Result:5
161212<10:29:24> / Step1(Sleep):Result:5.000
161212<10:31:53> / Step6(ECU_5v):Result:5.201
161212<10:32:59> / Step6(ECU_5v):Result:5.215
161212<10:38:02> / Step6(ECU_5v):Result:2.496
161212<10:40:25> / Step5(EPU_24v):Result:0.00
161212<10:41:00>Step5(EPU_24v):Result:0.14
161212<10:51:14> / Step1(Sleep):Result:-0.200
161212<10:51:32> / Step5(EPU_24v):Result:0.00
161212<10:53:32>Step5(EPU_24v):Result:0.00
161212<10:58:02> / Step48(sensa_off2):Result:5
161212<11:03:22> / Step7(ECU_3v):Result:0.045
161212<11:05:19> / Step7(ECU_3v):Result:0.121
161212<11:05:43>Step7(ECU_3v):Result:0.144
161212<11:08:11> / Step48(sensa_off2):Result:5
161212<11:13:05> / Step6(ECU_5v):Result:5.228
161212<11:13:27> / Step6(ECU_5v):Result:5.223
各位大神帮忙,谢谢,新手,谢谢谢谢
谢谢谢谢
谢谢谢谢
谢谢谢谢 推荐使用 afan 版大的 Au3Chm 函数询捕 (帮助文档最佳搭档)_1.5
我以file搜索,有两个符合你要求的
FileReadToArray
_FileReadToArray
然后再用StringInStr判断,可以很轻松做到.
既然学了C语言,那就别学au3了,还有C不能编写的程序吗 你的想法很繁琐, 可以换种简单的思路的.#include<array.au3>
Local $sFile = StringRight(@YEAR, 2) & @MON & @MDAY & 'e' ; 获取文件名
MsgBox(0, '文件名', $sFile)
Local $sTxt = ClipGet() ; fileread($sFile) ;读取文件内容,需注意路径
Local $aRe = StringRegExp($sTxt, 'Step[^:]+', 3) ;正则提取所有的 stepX
If @error Then Exit MsgBox(0, '', 'no step found')
$aRe = _ArrayUnique($aRe) ; 去除重复的 stepX
If @error <> 0 ThenExit MsgBox(0, '', 'err in aRe')
For $i = 1 To $aRe
StringReplace($sTxt, $aRe[$i], '')
Local $iN = @extended ;用替换法,快速获取每一个 stepX 在文件中的数量
MsgBox(0, $aRe[$i], '有' & $iN & '次')
Next
StringReplace($sTxt, $aRe[$i] & ':', '')这样获取更准确,把类似 step4 与 step41 区分开来. 回复 4# Alam
感谢,Alam,刚吃完饭,我理解研究一下,非常感谢 回复 3# Alam
你的代码好厉害!!非常感谢,太厉害了!!
路径我这样已经可以了,
我想能不能按大小顺序写到TXT呢
#include<array.au3>
Local $sFile = StringRight(@YEAR, 2) & @MON & @MDAY & 'e' ; 获取文件名
MsgBox(0, '文件名', $sFile)
Dim $filename="D:\"&$sFile&".log"
MsgBox(0,"文件地址",$filename)
$Read_file=FileRead ($filename)
ClipPut($Read_file)
Local $sTxt = ClipGet() ; fileread($sFile) ;读取文件内容,需注意路径
Local $aRe = StringRegExp($sTxt, 'Step[^:]+', 3) ;正则提取所有的 stepX
If @error Then Exit MsgBox(0, '', 'no step found')
$aRe = _ArrayUnique($aRe) ; 去除重复的 stepX
If @error <> 0 ThenExit MsgBox(0, '', 'err in aRe')
For $i = 1 To $aRe
StringReplace($sTxt, $aRe[$i], '')
Local $iN = @extended ;用替换法,快速获取每一个 stepX 在文件中的数量
MsgBox(0, $aRe[$i], '有' & $iN & '次')
Next 回复 2# q410225
还是谢谢你, 接触到了AU3,好用方便,实用,多学点其他的还是很好的,C也是一般水平,现在都在初级阶段,学习中... 学习,支持下. 本帖最后由 zghwelcome 于 2016-12-16 10:07 编辑
纯粹凑热闹#include <array.au3>
Local $sfile = @ScriptDir & '\' & StringRight(@YEAR,2) & @MON & @MDAY & 'e.log'
If Not FileExists($sfile) Then Exit MsgBox(4096,"","日志文件不存在.")
$oOpen = FileOpen($sfile,FileGetEncoding($sfile)) ;//防止编码为非ANSI时读取错误
Local $sRead = FileRead($oOpen)
FileClose($oOpen)
Local $sStr1 = '' ;定义匹配字符串
Local $sStr2 = '' ;//定义排序后的字符串
Local $sMaxNum = 0 ;//定义最大出现次数
;// 第一次匹配字符串
For $i = 1 To 60
$sStr1_Reg = StringRegExp($sRead,'(?i)Step' & $i & '\(Sleep\)',3) ;// 依次匹配 StepX(Sleep)
If Not @error Then
$sStr1 = $sStr1 & 'Step' & $i & '(Sleep):' & UBound($sStr1_Reg) & '_' & @CRLF
If UBound($sStr1_Reg) > $sMaxNum Then $sMaxNum = UBound($sStr1_Reg)
EndIf
Next
;MsgBox(0,$sMaxNum,$sStr1)
;//第二次利用正则匹配排序
If $sMaxNum > 0 Then
For $i = 1 To $sMaxNum
$sStr2_Reg = StringRegExp($sStr1,"(?i)(Step\d+\(Sleep\):" & $i & ')_',3)
If Not @error Then
$sStr2 = $sStr2 & _ArrayToString($sStr2_Reg,@CRLF) & @CRLF
EndIf
Next
EndIf
$oOpenResult = FileOpen(@ScriptDir & '\统计.txt',514) ;//统计写入文件
FileWrite($oOpenResult,$sStr2)
FileClose($oOpenResult)
MsgBox(0,'统计结果',$sStr2) #include <array.au3>
Local $sfile = @ScriptDir & '\' & StringRight(@YEAR,2) & @MON & @MDAY & 'e'
If Not FileExists($sfile) Then Exit MsgBox(4096,"","日志文件不存在.")
$oOpen = FileOpen($sfile,FileGetEncoding($sfile)) ;//防止编码为非ANSI时读取错误
Local $aArray=ObjCreate('Scripting.Dictionary') ;创建对象
If Not IsObj($aArray) Then Exit(MsgBox(16,'Sorry','无法创建对象,请另觅它途,我先撤了,88!!'))
While 1
$line = FileReadLine($oOpen)
If @error = -1 Then ExitLoop
$aStr = StringRegExp($line,'Step[^:]+', 3)
If @error Then ContinueLoop
If $aArray.Exists($aStr) Then
$aArray.item($aStr) += 1
Else
$aArray.item($aStr)=0
EndIf
WEnd
Dim $out
$out1=$aArray.keys()
$out2=$aArray.items()
ReDim $out
For $i=0 To UBound($out,1)-1
$out[$i]=$out1[$i]
$out[$i]=$out2[$i]
next
_ArraySort($out,0,Default,Default,1) 修改Alam的程序已经完全能实现我的预期!!请版主移至问题已解决板块!!感谢帮忙的朋友们!谢谢 本帖最后由 yangyangban 于 2016-12-25 23:13 编辑
回复 4# Alam
大神,我现在改了程序,怎么运行到最后总是出现这个问题呢?不管是否打开结果文件,还是不打开,都会报错,帮帮看一下
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <Date.au3>
#include<string.au3>
#include <EditConstants.au3>
#include<array.au3>
#Region ### START Koda GUI section ### Form=
#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_icon=ico.ico
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
Global $RM
Global $NAME
Global $label2
Global $Filename1=1
$Form1 = GUICreate("welcome", 482, 285, 650, 250)
$Pic1 = GUICtrlCreatePic("", 25, 35, 180, 200)
GUICtrlSetImage($Pic1, @WorkingDir&"\13.jpg")
$Button1 = GUICtrlCreateButton("About",420, 6, 50, 23)
$Button2 = GUICtrlCreateButton("OPEN R7590", 250,45, 75, 33)
$label3 = GUICtrlCreateLabel("RM2-8086_8191",350,55, 95, 33)
GUICtrlSetFont(1, 10, 800, 0, "")
$Button3 = GUICtrlCreateButton("OPEN R7553", 250, 105, 75, 43)
$label4 = GUICtrlCreateLabel("RM2-8086_8085",350,115, 95, 43)
GUICtrlSetFont(1, 10, 800, 0, "")
$Button4 = GUICtrlCreateButton("OPEN R7707", 250, 180, 75, 33)
$label5 = GUICtrlCreateLabel("RM2-8525_8524",350,190, 95, 43)
GUICtrlSetFont(1, 10, 800, 0, "")
Sleep(50)
$Label5 = GUICtrlCreateLabel("Time:"&_Now(), 280, 260, 200, 16)
GUICtrlSetFont(-1, 10, 800, 0, "")
GUICtrlSetColor(-1, 0x0000ff)
Global $t2, $t3 = 1
$Timer = DllCallbackRegister("Timer", "int", "hwnd;uint;uint;dword")
$TimerDLL = DllCall("user32.dll", "uint", "SetTimer", "hwnd", 0, "uint", 0, "int", 1000, "ptr", DllCallbackGetPtr($Timer))
$Timer2 = DllCallbackRegister("Timer", "int", "hwnd;uint;uint;dword")
$Timer2DLL = DllCall("user32.dll", "uint", "SetTimer", "hwnd", 0, "uint", 0, "int", 200, "ptr", DllCallbackGetPtr($Timer2))
$Timer3 = DllCallbackRegister("Timer", "int", "hwnd;uint;uint;dword")
$Timer3DLL = DllCall("user32.dll", "uint", "SetTimer", "hwnd", 0, "uint", 0, "int", 500, "ptr", DllCallbackGetPtr($Timer3))
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
;Local $TIMEIN =InputBox("Time Input"," 请输入需要查询的日期:"& @CRLF& "(不输入则默认当前时间)" & @CRLF& " 格式:20160102","","",200,160,100,100)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
Case $Button2
ShellExecute( MODEL(7590, 8191), "", "", "open")
Case $Button3
ShellExecute( MODEL(7553, 8085), "", "", "open")
Case $Button4
ShellExecute( MODEL(7707,8524), "", "", "open")
EndSwitch
WEnd
Func Timer($hWnd, $uiMsg, $idEvent, $dwTime)
If $idEvent = $TimerDLL Then
GUICtrlSetData($Label5, "Time:"&@YEAR &"-"&@MON&"-"&@MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC)
EndIf
EndFunc
FuncMODEL($NAME, $RM)
Local $TIMEIN
Local $MNAME = "R" &$NAME
If $RM=8191 Then $RM="RM2-8086_8191"
IF $RM=8085 Then $RM="RM2-8086_8085"
IF $RM=8524 Then$RM="RM2-8525_8524"
Local $readResult=@WorkingDir & "\" & $MNAME &"result.Log";read result add 结果文档输出路径
if FileExists($readResult) then FileDelete($readResult)
Dim $space
local $failtotal=0;all fail total
if FileExists($readResult) then FileDelete($readResult)
;文件名处理
Local $sFile =@YEAR & @MON & @MDAY; get log file name 获取文件名Local
Local $YEAR = StringTrimRight($sFILE,4)
Local $MON = StringMid($sFILE,5,2)
Local $DAY = StringRight($sFILE,2)
Local $shijian=MsgBox(4, 'time', "You will chck time is :" & @CRLF& @CRLF &@YEAR &"-"&@MON&"-"&@MDAY& @CRLF& @CRLF&" Yes or not? if notpls input the time ");
if $shijian=6then
$sFile= StringRight($sFile,6) & 'e'
EndIf
If $shijian=7 then
$TIMEIN =InputBox("Time Input"," 请输入需要查询的日期:"& @CRLF& @CRLF& @CRLF& " 格式:20160102","","",200,200,710,350);长,宽,右,左,
;判断输入日期是否正确
Local $MON1 = StringMid($TIMEIN,5,2)
Local $DAY2 = StringRight($TIMEIN,2)
While StringLen($TIMEIN)<>8 Or $MON1 <=0 Or$MON1 >12 Or $DAY2 <=0 Or$DAY2 >31
If $TIMEIN="exit" then exit
$TIMEIN=InputBox("Time Input","日期不正确,请重新输入" & @CRLF& @CRLF& @CRLF& " 格式:20160102","","",200,200,710,350)
$MON1 = StringMid($TIMEIN,5,2)
$DAY2 = StringRight($TIMEIN,2)
WEnd
$sFile=StringTrimLeft($TIMEIN,2) & 'e'
EndIf
Dim $filenam= ""&$sFile&".log"
MsgBox(32, 'Log file name', $filenam);Display name 显示文件名
Local $filename=@WorkingDir&"\"& $RM&"\ErrorLog\"&$sFile&".log" ;add+file name 路径结合文件名
$filename= $filename
Local $Read_file=FileRead ($filename)
ClipPut($Read_file)
Local $sTxt = ClipGet() ; fileread($sFile) ;fileread读取文件内容,需注意路径
Local $aRe = StringRegExp($sTxt, 'Step[^:]+', 3) ;get all the test fail step正则提取所有的 stepX
If @error Then Exit MsgBox(16, 'ERROR', 'No step found')
$aRe = _ArrayUnique($aRe) ; 去除重复的 stepX
If @error <> 0 ThenExit MsgBox(16, 'ERROR', 'ERROR in aRe')
For $i = 1 To $aRe
StringReplace($sTxt, $aRe[$i], '')
Local $iN = @extended ;用替换法,快速获取每一个 stepX 在文件中的数量
$failtotal=$failtotal+$iN;all step fail total
FileWrite($readResult,"Step Name:"& $aRe[$i]&@CRLF);weite STEP name
FileWrite($readResult,"Fail Total:" & $iN&@CRLF) ;fail total总数量
FileWrite($readResult,""& $space&@CRLF)
Next
FileWrite($readResult,"All Step Fail Total:" & $failtotal&@CRLF) ;fail total总数量;display all fail total
Local $fanhui=MsgBox(4, 'Result', " Congratulations ,Finish!!!" & @CRLF& "" & @CRLF& " Open the file or not?");
if $fanhui=6thenShellExecute($readResult, "", "", "open")
If $fanhui=7then FileClose($readResult)
EndFunc 本帖最后由 Alam 于 2016-12-23 12:41 编辑
试运行了一下,没发现什么不妥,也未找到产生图中警告的语句.
首先要弄清楚,这警告是怎么来的呢?
....这应该是系统给出的警告吧,打开文件时,文件不存在
ShellExecute($readResult, "", "", "open")
请先保证此文件的"存在" 建议大家贴代码上来时用【au3】你的代码【/au3】来发帖(将中括号改为英文的,我如果发英文,就用代码形式表示了),这样看起来更舒服!!代码我也没有具体看了。
页:
[1]
2