替换字符串并在批处理文件的列中查找值

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 依次接收该行的每个元素。

如果元素恰好是 absentunknown,请将 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

请注意,如果数据已经存在,它们将附加到报告文件中。如果生成的 reasonlate,则变量 outfile 被简单地初始化为每一行的 absorunk 并更改为 late。由于 reason 仅在有理由报告当前数据行时才定义,因此未报告的行仍然未报告。