因別的單位一直無法快速有效的整理記錄檔,在研究之後決定自己下手處理。不然客戶壓力會導致最後又是自己人工整理資料。
資料的形式是這樣:
* 要擷取的資料在資料檔裡面有特定關鍵字
* 每個識別碼有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
沒有留言:
張貼留言