替换字符串并在批处理文件的列中查找值
Replace string and find value in column in Batch file
我有如下文件,我需要查明是否有任何员工在两个时间列中“缺勤或未知”或迟到超过 1 分钟。
Col1 col2 col3 HH MM SS HH MM SS
sales Present George 01:02:00 04:05:00
sales absent Linda 00:00:03 00:00:00
Marketing unknown James 00:00:00 00:00:00
我成功删除了“:”,但不确定如何放置 if 条件管道回显
(for /f "delims=" %%i in (%files%) do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line::= !"
echo(!line!
endlocal
))
尝试获得类似
的输出
George is more than 1 hr and 2 min late
Linda is absent
非常感谢任何帮助。
@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION
SET "filename1=q72007068.txt"
(
FOR /f "skip=1delims=" %%e IN (%filename1%) DO (
SET "reason="
set "outfile=absorunk"
FOR %%y IN (%%e) DO (
FOR %%o IN (absent unknown) DO IF %%o==%%y SET "reason=%%o"
FOR /f "tokens=1-3delims=:" %%u IN ("%%y") DO (
IF "%%w"=="" (
SET "person=%%y"
) ELSE (
SET /a late=1%%u%%v%%w
IF NOT DEFINED reason IF !late! gtr 1000100 SET "reason=late %%u:%%v:%%w"&set "outfile=late"
)
)
)
IF DEFINED reason ECHO !person! is !reason!>>"report_!outfile!.txt"
)
)
GOTO :EOF
%%e
从文件中接收每一行,跳过第一行。
reason
用作标志来记录生成报告行的原因 - 如果生成。
%%y
依次接收该行的每个元素。
如果元素恰好是 absent
或 unknown
,请将 reason
设置为该值。
尝试使用 :
作为分隔符将元素标记为 %%u
..%%w
。
如果未设置 %%w
,则这不是 time 元素,因此 person
将设置为元素值,因此将包含第一个 time 之前的元素
元素,即人名。
如果设置了%%w
,将hh:mm:ss形式为1hhmmss,这是一个没有前导0
的十进制数。将其与 1000100
进行比较,后者是在相同基础上计算的 1 分钟。如果更大,则将 reason
设置为“迟到 + 实际 time-late.
如果在处理完所有元素后,reason
已设置,则生成一个报告行,详细说明人员和原因。
我会将时间的格式留作感兴趣的人的练习。
---修改
根据评论,将缺席或未知的报告发送至 report_absorunk.txt
,将迟到的报告发送至 report_late.txt
。
请注意,如果数据已经存在,它们将附加到报告文件中。如果生成的 reason
是 late
,则变量 outfile
被简单地初始化为每一行的 absorunk
并更改为 late
。由于 reason
仅在有理由报告当前数据行时才定义,因此未报告的行仍然未报告。
我有如下文件,我需要查明是否有任何员工在两个时间列中“缺勤或未知”或迟到超过 1 分钟。
Col1 col2 col3 HH MM SS HH MM SS
sales Present George 01:02:00 04:05:00
sales absent Linda 00:00:03 00:00:00
Marketing unknown James 00:00:00 00:00:00
我成功删除了“:”,但不确定如何放置 if 条件管道回显
(for /f "delims=" %%i in (%files%) do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line::= !"
echo(!line!
endlocal
))
尝试获得类似
的输出George is more than 1 hr and 2 min late
Linda is absent
非常感谢任何帮助。
@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION
SET "filename1=q72007068.txt"
(
FOR /f "skip=1delims=" %%e IN (%filename1%) DO (
SET "reason="
set "outfile=absorunk"
FOR %%y IN (%%e) DO (
FOR %%o IN (absent unknown) DO IF %%o==%%y SET "reason=%%o"
FOR /f "tokens=1-3delims=:" %%u IN ("%%y") DO (
IF "%%w"=="" (
SET "person=%%y"
) ELSE (
SET /a late=1%%u%%v%%w
IF NOT DEFINED reason IF !late! gtr 1000100 SET "reason=late %%u:%%v:%%w"&set "outfile=late"
)
)
)
IF DEFINED reason ECHO !person! is !reason!>>"report_!outfile!.txt"
)
)
GOTO :EOF
%%e
从文件中接收每一行,跳过第一行。
reason
用作标志来记录生成报告行的原因 - 如果生成。
%%y
依次接收该行的每个元素。
如果元素恰好是 absent
或 unknown
,请将 reason
设置为该值。
尝试使用 :
作为分隔符将元素标记为 %%u
..%%w
。
如果未设置 %%w
,则这不是 time 元素,因此 person
将设置为元素值,因此将包含第一个 time 之前的元素
元素,即人名。
如果设置了%%w
,将hh:mm:ss形式为1hhmmss,这是一个没有前导0
的十进制数。将其与 1000100
进行比较,后者是在相同基础上计算的 1 分钟。如果更大,则将 reason
设置为“迟到 + 实际 time-late.
如果在处理完所有元素后,reason
已设置,则生成一个报告行,详细说明人员和原因。
我会将时间的格式留作感兴趣的人的练习。
---修改
根据评论,将缺席或未知的报告发送至 report_absorunk.txt
,将迟到的报告发送至 report_late.txt
。
请注意,如果数据已经存在,它们将附加到报告文件中。如果生成的 reason
是 late
,则变量 outfile
被简单地初始化为每一行的 absorunk
并更改为 late
。由于 reason
仅在有理由报告当前数据行时才定义,因此未报告的行仍然未报告。