2021/08/24

[note] use batch to collect specified log

工作幹過最瘋狂的事情之一。我都在想我是不是該轉單位了。

因別的單位一直無法快速有效的整理記錄檔,在研究之後決定自己下手處理。不然客戶壓力會導致最後又是自己人工整理資料。
資料的形式是這樣:
* 要擷取的資料在資料檔裡面有特定關鍵字
* 每個識別碼有1~2個資料檔要擷取。
* 資料檔會放到以識別碼為名的資料夾內。

##ReadMore##

原本請軟體部門幫忙,軟體部門就給findstr,叫我們一個一個檔案find,跟白癡一樣。請他們改進他們無動於衷,反正有動就好。後來自己改進作法,概念是:
* 列出資料檔的名字
* 根據上一步擷取部分路徑名作為識別碼
* 為了能快速索引,使用亂數並用set塞到記憶體內,為了避免有意外,有特別寫個無限迴圈。跑進去的機率應該超低。
* 先執行第一個資料檔搜尋,再執行第二個。如果找第二個資料擷取發現沒有執行過第一個,則寫入空的資料
* 利用set打名稱不打資料會列出開頭為名稱(含其他有後綴)的特性做資料全數列出

第一版大概花了四小時左右讓他可以運作,中間還利用一些call的技巧讓他可以叫出雙重參數。真的很瘋狂。


為了怕麻煩我有盡量去識別,破壞我原本寫的部分關鍵字和一些特徵,所以拿回原本的地方不一定能用。

source code batch:


@echo off

set ff1=data.LOG
set ff2=data2.LOG

set lp1=path1.txt
set lp2=path2.txt
set d2=log_id
set op=log_all.csv


del %op%
dir /a /b /s %ff1% > %lp1%
dir /a /b /s %ff2% > %lp2%

SETLOCAL ENABLEDELAYEDEXPANSION

:reset_rand
set ran=!random!
set dr=%d2%!ran!,
set !dr!
if %ERRORLEVEL% NEQ 1 goto reset_rand

for /f "usebackq delims=" %%a in ( %lp1% ) do (
    set tv="%%a"
	set tu=!dr!#!tv:~-20,10!,
    FOR /F "tokens=* USEBACKQ" %%g IN (`findstr "^Data_specified:*$" "%%a"`) do ( 
        SET tv=%%g
        SET !tu!=,data1,!tv:~20!
    )
)

for /f "usebackq delims=" %%a in ( %lp2% ) do (
    set tv="%%a"
	set tu=!dr!#!tv:~-21,10!,
    FOR /F "tokens=* USEBACKQ" %%g IN (`findstr "^Data_specified:*$" "%%a"`) do ( 
        SET tv=%%g
        if !tu!=="" SET !tu!=,data1,,,,,,,,,,,,,,,
        call SET !tu!=%%!tu!%%,data2,!tv:~20!
    )
)
set %dr% > %op%
ENDLOCAL


沒有留言: