iT邦幫忙

0

如何利用bat檔,自動刪除txt檔的某些資料

請教各位先進
如何將考勤資料中的數據經比較後刪除不想要的資料
例如下列中第9-12碼為刷卡時間 我只想保留0900-1700的資料 只要不在這個範圍內的整列刪除
不知道有沒有辦法用批次檔來完成

201610030739000100455213010001
201610030820000101466590090001
201610030820000160725347640001
201610030820000160725347640001
201610030820000160725347640001
201610030820000160725347640001
201610030821000160725347640001
201610030821000160725347640001
201610030821000160725347640001
201610030821000160725347640001
openbmw iT邦新手 5 級 ‧ 2016-10-19 08:45:33 檢舉
您好,如果您有興趣我可以提供我開發的人事系統給你用,系統包含打卡、請假、排班。軟體不用買。我不是公司是自己開發的,如果你想用或想了解看看我的mail:openbmw@gmail.com
openbmw iT邦新手 5 級 ‧ 2016-10-19 08:46:30 檢舉
忘了說我的是雲端,最後會產生薪資單。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
haoming
iT邦好手 1 級 ‧ 2016-10-18 10:08:39
最佳解答

利用findstr
findstr /r "\<2016....09 \<2016....1[1-5]" filein.txt > fileout.txt

您寫的 RE 看起來比我高級多了
如果再加上 10點 和 16點
應該就是正解了

要再讚一點的話
看看是不是改善一下「年份」的處理
才不用每年都要來改一次批次檔
/images/emoticon/emoticon13.gif

haoming iT邦好手 1 級 ‧ 2016-10-18 11:48:53 檢舉

對喔 少了 10點..
我第一版的 re 是這樣寫

findstr /r "\<2016[0-9][0-9][0-9][0-9]09 \<2016[0-9][0-9][0-9][0-9]1[1-5]" list.txt

也是參考你的 改良的..
findstr的 re 比較畸形, 沒辦法用()符號

補上10點跟16的寫法如下

findstr /r "\<2016....09 \<2016....1[0-6]" filein.txt > fileout.txt

如果資料都固定 不會有其他 例外資料的話,乾脆都用.號

findstr /r "\<........09 \<........1[0-6]" filein.txt > fileout.txt

201x 可能還是留著比較好
不然 ........09 可能會有很多符合的情形...
/images/emoticon/emoticon06.gif

0
做工仔人!
iT邦大師 1 級 ‧ 2016-10-18 08:45:29

樓主的這個問題不建議用 bat 檔來刪除資料.因為會出錯.
刷卡資料要保留每個員工在當天的第一筆及最後一筆刷卡資料的功能.應該是考勤系統來處理.
(考勤系統先將資料轉進temp檔後,再將每個員工每天的第一筆及最後一筆刷卡資料匯入考勤.再比對上下班時間的設定後,才能判定是否有員工:遲到早退等)
若樓主公司的刷卡資料量大時.應該是將刷卡資料分天儲存.
以前我們公司的人事作法:
每10天另存一個新檔.會將原本來匯入的檔案中這10天的資料刪除.(其實她是直接將這個檔刪掉,隔天刷卡系統就會自動產生一個新檔)
雖然是答非所問,但是以上供樓主參考.

0
海綿寶寶
iT邦大神 1 級 ‧ 2016-10-18 08:46:34

沒辦法

回太快了

用 findstr 搭配 RE 應該有可能

findstr /r "2016....(09|10|11|12|13|14|15|16)" filename.in > filename.out
小成 iT邦高手 10 級 ‧ 2016-10-18 09:14:10 檢舉

啊,我忘了有findstr

0
小成
iT邦高手 10 級 ‧ 2016-10-18 09:13:04
@echo off
setlocal EnableDelayedExpansion 
d:
cd \
for /F %%i in (來源檔名) do (
set aa=%%i
set bb=!aa:~8,2!
if !bb! leq 17  (
if !bb! geq 09 (
echo %%i >> 目的地檔名
)
)
)

另存成 bat 執行看看...

simon0627 iT邦新手 2 級 ‧ 2016-10-21 14:59:43 檢舉

酷~~~
但設定變數的地方好像不行是否要改成
set bb=%aa:~8,2%

小成 iT邦高手 10 級 ‧ 2016-10-24 08:05:55 檢舉

要用!喔,不能用%
因為這個bb變數的值是從前一個aa來的,如果用%,那麼這個bb就會從頭到尾都一樣。
請參考一下以下微軟的說明:

預設不會啟用延遲環境變數擴充。您可以使用 /V:ON 或 /V:OFF 參數在執行特定 MD.EXE 呼叫時啟用或停用延遲環境變數擴充。您可以啟用或停用電腦和 (或) 使用者登入工作階段上所有 CMD.EXE 呼叫的延遲擴充,方法是使用 REGEDIT.EXE 將登錄中的下列一或兩個 REG_DWORD 值:

HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion

   和 (或)

HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion

設定為 0x1 或 0x0。使用者特定設定的優先順序高於電腦設定。命令列參數的優先順序高於登錄設定。

在批次檔中,SETLOCAL ENABLEDELAYEDEXPANSION 或 DISABLEDELAYEDEXPANSION 引數的優先順序高於 /V:ON 或 /V:OFF 參數。如需詳細資料,請參閱 SETLOCAL /?。

如果已啟用延遲環境變數擴充,則驚嘆號字元是用來在執行時取代環境變數值。

小成 iT邦高手 10 級 ‧ 2016-10-24 08:11:46 檢舉

上面的說明來自 cmd /?
我們可以用 cmd /V:ON 來啟用延遲環境變數擴充,
或者直接在批次檔中用 setlocal EnableDelayedExpansion 啟用延遲環境變數擴充。
使用 setlocal 的優先順序高於 CMD /V:ON

我要發表回答

立即登入回答