找回密码
 加入
搜索
查看: 5979|回复: 20

[AU3基础] 大神帮帮忙,关于读取TXT,log,问题,

 火.. [复制链接]
发表于 2016-12-15 16:56:30 | 显示全部楼层 |阅读模式
终于注册了账户,想提问还得等两小时,刚接触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


各位大神帮忙,谢谢,新手,谢谢谢谢
谢谢谢谢
谢谢谢谢
谢谢谢谢
发表于 2016-12-15 18:12:42 | 显示全部楼层
推荐使用 afan 版大的 Au3Chm 函数询捕 (帮助文档最佳搭档)_1.5

我以file搜索,有两个符合你要求的
FileReadToArray
_FileReadToArray
然后再用StringInStr判断,可以很轻松做到.
既然学了C语言,那就别学au3了,还有C不能编写的程序吗
发表于 2016-12-15 18:20:31 | 显示全部楼层
你的想法很繁琐, 可以换种简单的思路的.
#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 Then  Exit MsgBox(0, '', 'err in aRe')
For $i = 1 To $aRe[0]        
        StringReplace($sTxt, $aRe[$i], '')
        Local $iN = @extended ;用替换法,快速获取每一个 stepX 在文件中的数量
        MsgBox(0, $aRe[$i], '有' & $iN & '次')
Next
发表于 2016-12-15 19:28:12 | 显示全部楼层
StringReplace($sTxt, $aRe[$i] & ':', '')
这样获取更准确,把类似 step4 与 step41 区分开来.
 楼主| 发表于 2016-12-15 19:52:14 | 显示全部楼层
回复 4# Alam
感谢,Alam,刚吃完饭,我理解研究一下,非常感谢
 楼主| 发表于 2016-12-15 21:10:34 | 显示全部楼层
回复 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 Then  Exit MsgBox(0, '', 'err in aRe')
For $i = 1 To $aRe[0]        
        StringReplace($sTxt, $aRe[$i], '')
        Local $iN = @extended ;用替换法,快速获取每一个 stepX 在文件中的数量
        MsgBox(0, $aRe[$i], '有' & $iN & '次')
               
               
        Next
 楼主| 发表于 2016-12-15 21:29:49 | 显示全部楼层
回复 2# q410225


   还是谢谢你, 接触到了AU3,好用方便,实用,多学点其他的还是很好的,C也是一般水平,现在都在初级阶段,学习中...
发表于 2016-12-16 09:26:32 | 显示全部楼层
学习,支持下.
发表于 2016-12-16 09:57:24 | 显示全部楼层
本帖最后由 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)
发表于 2016-12-16 12:56:51 | 显示全部楼层
#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[0]) Then
                $aArray.item($aStr[0]) += 1
        Else
                $aArray.item($aStr[0])=0
        EndIf
WEnd
Dim $out[1]
$out1=$aArray.keys()
$out2=$aArray.items()
ReDim $out[UBound($out1)][2]
For $i=0 To UBound($out,1)-1
$out[$i][0]=$out1[$i]
$out[$i][1]=$out2[$i]
next
_ArraySort($out,0,Default,Default,1)
 楼主| 发表于 2016-12-19 08:33:02 | 显示全部楼层
修改Alam的程序已经完全能实现我的预期!!请版主移至问题已解决板块!!感谢帮忙的朋友们!谢谢
 楼主| 发表于 2016-12-22 22:16:46 | 显示全部楼层
本帖最后由 yangyangban 于 2016-12-25 23:13 编辑

回复 4# Alam

大神,我现在改了程序,怎么运行到最后总是出现这个问题呢?不管是否打开结果文件,还是不打开,都会报错,帮帮看一下

[img][/img]
#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[0] Then
                GUICtrlSetData($Label5, "Time:"&@YEAR &"-"&@MON&"-"&@MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC  )
        EndIf
        EndFunc
        
        
        Func  MODEL($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 not  pls input the time ");
             if $shijian=6  then  
                         $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 Then  Exit MsgBox(16, 'ERROR', 'ERROR in aRe')
        
For $i = 1 To $aRe[0]        
        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=6  then  ShellExecute($readResult, "", "", "open") 
                                  
                  If $fanhui=7  then   FileClose($readResult) 
                
        EndFunc        
 楼主| 发表于 2016-12-22 22:19:38 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2016-12-23 07:31:22 | 显示全部楼层
本帖最后由 Alam 于 2016-12-23 12:41 编辑

试运行了一下,没发现什么不妥,也未找到产生图中警告的语句.
首先要弄清楚,这警告是怎么来的呢?


....这应该是系统给出的警告吧,打开文件时,文件不存在
ShellExecute($readResult, "", "", "open")
请先保证此文件的"存在"
发表于 2016-12-23 08:03:08 | 显示全部楼层
建议大家贴代码上来时用【au3】你的代码【/au3】来发帖(将中括号改为英文的,我如果发英文,就用代码形式表示了),这样看起来更舒服!!代码我也没有具体看了。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-14 15:10 , Processed in 0.084046 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表