yangyangban 发表于 2016-12-15 16:56:30

大神帮帮忙,关于读取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


各位大神帮忙,谢谢,新手,谢谢谢谢
谢谢谢谢
谢谢谢谢
谢谢谢谢

q410225 发表于 2016-12-15 18:12:42

推荐使用 afan 版大的 Au3Chm 函数询捕 (帮助文档最佳搭档)_1.5

我以file搜索,有两个符合你要求的
FileReadToArray
_FileReadToArray
然后再用StringInStr判断,可以很轻松做到.
既然学了C语言,那就别学au3了,还有C不能编写的程序吗

Alam 发表于 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 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

Alam 发表于 2016-12-15 19:28:12

StringReplace($sTxt, $aRe[$i] & ':', '')这样获取更准确,把类似 step4 与 step41 区分开来.

yangyangban 发表于 2016-12-15 19:52:14

回复 4# Alam
感谢,Alam,刚吃完饭,我理解研究一下,非常感谢

yangyangban 发表于 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 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

yangyangban 发表于 2016-12-15 21:29:49

回复 2# q410225


   还是谢谢你, 接触到了AU3,好用方便,实用,多学点其他的还是很好的,C也是一般水平,现在都在初级阶段,学习中...

jamal 发表于 2016-12-16 09:26:32

学习,支持下.

zghwelcome 发表于 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)

h20040606 发表于 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) 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)

yangyangban 发表于 2016-12-19 08:33:02

修改Alam的程序已经完全能实现我的预期!!请版主移至问题已解决板块!!感谢帮忙的朋友们!谢谢

yangyangban 发表于 2016-12-22 22:16:46

本帖最后由 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       

yangyangban 发表于 2016-12-22 22:19:38

Alam 发表于 2016-12-23 07:31:22

本帖最后由 Alam 于 2016-12-23 12:41 编辑

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


....这应该是系统给出的警告吧,打开文件时,文件不存在
ShellExecute($readResult, "", "", "open")
请先保证此文件的"存在"

xlj310 发表于 2016-12-23 08:03:08

建议大家贴代码上来时用【au3】你的代码【/au3】来发帖(将中括号改为英文的,我如果发英文,就用代码形式表示了),这样看起来更舒服!!代码我也没有具体看了。
页: [1] 2
查看完整版本: 大神帮帮忙,关于读取TXT,log,问题,