1

AutoIt を使用してテキスト ファイルを調べ、選択した行を CSV に出力しようとしています。私が遭遇し続ける問題は、永遠にかかるということです。現在の方法では、一度に 1 行ずつ調べます。1 秒あたり 5 ~ 10 行を焼き尽くすことができますが、AutoIt フレームワーク内でもっと高速なものを探しています。

コード:

#include <File.au3>
$xnConfirm = False
$xnConfirmMsg = 0
while $xnConfirm = False

      $xnFile = FileOpenDialog("File to Examine...","%userprofile%","All (*.*)") ;InputBox("File???", "Which file do you want to review?","C:\")
   If FileExists($xnFile) = True Then
            $xnConfirm = True
         Else
               $xnConfirmMsg = msgbox(1,"File Not Found...",$xnFile & " does not exist." & @crlf &  "Please select another file.")
      EndIf
WEnd

$xnConfirm = False
$xnConfirmMsg = 0
while $xnConfirm = False
   $xnTargetFile = FileOpenDialog("Location to Save to...",$xnFile & " - output.csv","All (*.*)");"%userprofile%\Documents\output.csv" 
                  ;FileSaveDialog("Location to Save to...","%userprofile%","All (*.*)",16,"output - " & $xnFile & " - output.csv") ;
         Consolewrite("Outputting to " & $xnTargetFile & @crlf)

      if fileexists($xnTargetFile) then
            $xnConfirmMsg = msgbox(4,"Overwrite?","Are you sure you want to overwrite " & @crlf & $xnTargetFile)

               if $xnConfirmMsg = 6 Then
                  $xnConfirm = True
                  filedelete($xnTargetFile)               
               EndIf
            Else   

               $xnConfirm = True

      EndIf    
WEnd

progresson("Line count","Verifying the number of lines in " & $xnFile)
$xnFileLine = _FileCountLines($xnFile) ;InputBox("Number of lines","How many lines are in this document?",10000)
consolewrite("Loading "& $xnFile & " with " & $xnFileLine & " total lines." &  @crlf)
progressoff()

local $hfl = FileOpen($xnFile,0)
FileWrite($xnTargetFile,"")
FileOpen($xnTargetFile, 1)

$i = 1

ProgressOn("Creating CSV","Extracting matching data.","",0,0,16)
$xnTargetLine = 1

FileWriteLine($xnTargetFile,"Timestamp,Message,Category,Priority,EventId,Severity,Title,Machine,App Domain,ProcessID,Process Name,Thread Name,Win32 ThreadId")

While $i < $xnFileLine

                  ;$xnCurrentLine = FileReadLine($xnFile,$i) ;Old Settings
            $xnCurrentLine = FileReadLine($hfl,$i)
            ;MsgBox(1,"",$xnCurrentLine)

      Select
         Case stringinstr($xnCurrentLine,"Timestamp:")
            $xnTargetLine = stringmid($xnCurrentLine,12,stringlen($xnCurrentLine) - 12 + 1) & "," 
         Case stringinstr($xnCurrentLine,"Message:")
            $xnTargetLine = $xnTargetLine  & stringmid($xnCurrentLine,10,stringlen($xnCurrentLine) - 10 + 1) & ","
         Case stringinstr($xnCurrentLine,"Category:")
            $xnTargetLine = $xnTargetLine  & stringmid($xnCurrentLine,11,stringlen($xnCurrentLine) - 11 + 1) & ","
         Case stringinstr($xnCurrentLine,"Win32 ThreadId:")
            $xnTargetLine = $xnTargetLine  & stringmid($xnCurrentLine,16,stringlen($xnCurrentLine) - 16 + 1) & @crlf
               FileWriteLine($xnTargetFile,$xnTargetLine)
         case Else
               consolewrite("Nothing on line " & $i & @crlf)
      EndSelect
         $i = $i + 1
                     ProgressSet(round($i/$xnFileLine * 100,1),$i & " of " & $xnFileLine & " lines examined." & @cr & "Thank you for your patience.")
   WEnd
ProgressOff()

これが何をしているのかという疑問に答えるために、トレース ログに似たログ ファイルを読んでいます。傾向を調査できるように、イベントを CSV に出力したいと考えています。ログ ファイルの形式は次のようになります。

Timestamp: 9/26/2013 3:33:23 AM

Message: Log Event Received

Category: Transaction

Win32 ThreadId:2872

それがコード形式であることは知っていますが、読みやすいといいのですが。

4

3 に答える 3