找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 28224|回复: 15

[文本处理] 批处理怎样找出符合条件的文件?

[复制链接]
发表于 2024-12-2 21:16:15 | 显示全部楼层 |阅读模式
Hi.各位大哥哥好
在所有文本中找出符合条件的文件

主要条件
视制表符tab  为分隔符
如果第2列时间在2秒时间内
如果第3列上中下行顺序是1  2  3 序列,允许有连续多个1,或连续多个2,或连续多个3出现,但不能是其他数字出现的 (  1到3之间只能是2,  不能是其它数字 )
时间条件最好可以自定义,例如设3秒或5秒
set /a m-n=2

下面用一句话表达出意思给大家吧,
如果第2列时间符合在设定2秒时间内,第3列上中下行序列又是1-2-3队列样式的,就比较第3列数字是1的第5列的数值 和 第3列数字是3的第5列的数值它们是否相同,如果相同,就输出该文件名,如果不符合条件,就跳过
例如, 第3列上中下行顺序是1  2  3 序列
  1. 第3列样式上中下行顺序条件注释,  (  1到3之间只能是2,  不能是其它数字 )
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 或可以连续有多个2,或连续有多个3出现,但不能是其他数字出现的
  9. 1
  10. 1
  11. 2
  12. 2
  13. 3
  14. 3
  15. 4
  16. 4
  17. 5
  18. 6
复制代码
例1.txt  
1        Mar  9, 2024 18:02:40.019514000 时间        1        0        3514ebc0031b08
2        Mar  9, 2024 18:02:40.119514000 时间        1        0        3514ebc0031b08
5        Mar  9, 2024 18:02:40.219514000 时间        1        0        3514ebc0031b08
7        Mar  9, 2024 18:02:40.322064000 时间        2        6        604b3ed20969da
9        Mar  9, 2024 18:02:40.422064000 时间        2        5        004b3ed20969da
15        Mar  9, 2024 18:02:40.522064000 时间        2        2        404b3ed20969da58969
18        Mar  9, 2024 18:02:40.622064000 时间        2        1        504b3ed20969da58969c4b1c
20        Mar  9, 2024 18:02:40.725658000 时间        3        0        3514ebc0031b08
22        Mar  9, 2024 18:02:41.825658000 时间        3        0        3514ebc0031b08
25        Mar  9, 2024 18:02:43.925658000 时间        3        0        3514ebc0031b08
50        Mar  9, 2024 18:02:43.328720000 时间        4        9        455c0031b080

不知道这样表达大家能理解不

请跳转下载文件  我还在每个文件中已注释有条件, 希望能理解出意思吧  https://wwkt.lanzoul.com/ipQeX2h4j1qf
Thanks
符合条件的文件结果, 其它的不符合
  1. 1.txt
  2. 2.txt
  3. 3.txt
复制代码
 楼主| 发表于 2024-12-3 10:14:11 | 显示全部楼层
这个虽然准确但是漏了一些不符合条件没有报告

  1. chcp 65001 >nul
  2. set /a m=n=2
  3. set /a "Jan=1,Feb=2,Mar=3,Apr=4,May=5,Jun=6,Jul=7,Aug=8,Sep=9,Oct=10,Nov=11,Dec=12"
  4. for /f "delims=" %%x in ('dir /b /a-d *.txt') do (
  5.         setlocal enabledelayedexpansion
  6.         for /f "useback tokens=1-9* delims=,.         " %%a in ("%%x") do (
  7.                 if %%h equ 1 (
  8.                         set t1=%%d-!%%b!-%%c %%e
  9.                         set t2=%%f
  10.                         set ss1=%%j
  11.                         set s2=
  12.                 ) else if %%h equ 2 (
  13.                         if defined ss1 (
  14.                                 set s2=1
  15.                         )
  16.                 ) else if %%h equ 3 (
  17.                         if defined s2 (
  18.                                 call :1 "!t1!" "%%d-!%%b!-%%c %%e"
  19.                                 if "%%f" geq "!t2!" (
  20.                                         set /a m=n-1
  21.                                 )
  22.                                 if !DiffSecs! leq !m! (
  23.                                         if "!ss1!" neq "%%j" (
  24.                                                 if not defined _"%%x" (
  25.                                                         >>out.txt echo %%x
  26.                                                         set _"%%x"=1
  27.                                                 )
  28.                                         )
  29.                                 )
  30.                                 set ss1=
  31.                                 set s2=
  32.                         )
  33.                 ) else (
  34.                         set ss1=
  35.                         set s2=
  36.                 )
  37.         )
  38.         endlocal
  39. )
  40. pause
  41. exit

  42. :1
  43. set StartTime=%~1
  44. set EndTime=%~2
  45. set StartTime=%StartTime:-= %
  46. set StartTime=%StartTime::= %
  47. set EndTime=%EndTime:-= %
  48. set EndTime=%EndTime::= %
  49. call :DateToSecs %StartTime% StartSecs
  50. call :DateToSecs %EndTime% EndSecs
  51. set /a DiffSecs=EndSecs-StartSecs
  52. set DiffSecs=%DiffSecs:-=%
  53. goto :eof

  54. :DateToSecs %yy% %mm% %dd% %hh% %nn% %ss% secs
  55. setlocal ENABLEEXTENSIONS
  56. set yy=%1&set mm=%2&set dd=%3&set hh=%4&set nn=%5&set ss=%6
  57. if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
  58. set /a dd=100%dd%%%100,mm=100%mm%%%100
  59. set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
  60. set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
  61. if 1%hh% LSS 20 set hh=0%hh%
  62. if {%nn:~2,1%} EQU {p} if "%hh%" NEQ "12" set hh=1%hh%&set/a hh-=88
  63. if {%nn:~2,1%} EQU {a} if "%hh%" EQU "12" set hh=00
  64. if {%nn:~2,1%} GEQ {a} set nn=%nn:~0,2%
  65. set /a hh=100%hh%%%100,nn=100%nn%%%100,ss=100%ss%%%100
  66. set /a j=j*86400+hh*3600+nn*60+ss
  67. endlocal&set %7=%j%&goto :EOF
复制代码
上面代码只报告了4.txt 不符合条件
但是漏了以下这些不符合条件没有报告, 还需要添加几个条件
  1. 5.txt
  2. 6.txt
  3. 7.txt
  4. 8.txt
  5. 9.txt
复制代码
发表于 2024-12-3 13:46:50 | 显示全部楼层
回复 2# 娜美


  
  1. @echo off
  2. chcp 65001 >nul
  3. set /a _cc=2
  4. set /a "Jan=1,Feb=2,Mar=3,Apr=4,May=5,Jun=6,Jul=7,Aug=8,Sep=9,Oct=10,Nov=11,Dec=12"
  5. for /f "delims=" %%x in ('dir /b /a-d *.txt') do (
  6.         setlocal enabledelayedexpansion
  7.         for /f "useback tokens=1-9* delims=,.         " %%a in ("%%x") do (
  8.                 if not defined _"%%x" (
  9.                         set _mm=0!%%b!
  10.                         set _dd=0%%c
  11.                         if "%%h" equ "1" (
  12.                                 set _tt=%%d-!_mm:~-2!-!_dd:~-2! %%e
  13.                                 set _str1=%%j
  14.                         ) else if "%%h" equ "2" (
  15.                                 if defined _tt (
  16.                                         set mark=1
  17.                                 )
  18.                         ) else if "%%h" equ "3" (
  19.                                 if defined mark (
  20.                                         set "_str2=%%j"
  21.                                         if "!_str1!" equ "!_str2!" (
  22.                                                 call :1 "!_tt!" "%%d-!_mm:~-2!-!_dd:~-2! %%e"
  23.                                                 if !DiffSecs! leq !_cc! (
  24.                                                         echo %%x
  25.                                                         set _"%%x"=1
  26.                                                 )
  27.                                         )
  28.                                 ) else (
  29.                                         set _tt=
  30.                                         set mark=
  31.                                 )
  32.                         ) else (
  33.                                 set _tt=
  34.                                 set mark=
  35.                         )
  36.                 )
  37.         )
  38.         endlocal
  39. )
  40. pause
  41. exit

  42.         :1
  43.         set StartTime=%~1
  44.         set EndTime=%~2
  45.         set StartTime=%StartTime:-= %
  46.         set StartTime=%StartTime::= %
  47.         set EndTime=%EndTime:-= %
  48.         set EndTime=%EndTime::= %
  49.         call :DateToSecs %StartTime% StartSecs
  50.         call :DateToSecs %EndTime% EndSecs
  51.         set /a DiffSecs=EndSecs-StartSecs
  52.         set DiffSecs=%DiffSecs:-=%
  53.         goto :eof

  54.         :DateToSecs %yy% %mm% %dd% %hh% %nn% %ss% secs
  55.         setlocal ENABLEEXTENSIONS
  56.         set yy=%1&set mm=%2&set dd=%3&set hh=%4&set nn=%5&set ss=%6
  57.         if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
  58.         set /a dd=100%dd%%%100,mm=100%mm%%%100
  59.         set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
  60.         set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
  61.         if 1%hh% LSS 20 set hh=0%hh%
  62.         if {%nn:~2,1%} EQU {p} if "%hh%" NEQ "12" set hh=1%hh%&set/a hh-=88
  63.         if {%nn:~2,1%} EQU {a} if "%hh%" EQU "12" set hh=00
  64.         if {%nn:~2,1%} GEQ {a} set nn=%nn:~0,2%
  65.         set /a hh=100%hh%%%100,nn=100%nn%%%100,ss=100%ss%%%100
  66.         set /a j=j*86400+hh*3600+nn*60+ss
  67.         endlocal&set %7=%j%&goto :EOF
复制代码

评分

参与人数 1技术 +1 收起 理由
娜美 + 1

查看全部评分

 楼主| 发表于 2024-12-3 14:00:33 | 显示全部楼层
回复 3# 77七


    @77七大哥哥这么快的吗   可以哟 thanks
发表于 2024-12-3 19:14:35 | 显示全部楼层
描述的不清不楚的
说是第2列时间在2秒时间内 ,但是看起来是第2列时间的差距 ,而且也没说清楚时间差距的比较方式 ,总不能随便找个时间差距2秒内的并且符合1..2..3..的区间吧
"比较第3列数字是1的第5列的数值 和 第3列数字是3的第5列的数值"这也没说清楚比较方式 ,总不能随便在区间里拿一行来出来比较吧
 楼主| 发表于 2024-12-3 19:30:25 | 显示全部楼层
回复 5# Five66


   哥哥已经解决了哦, 3楼哥哥理解正确的
发表于 2024-12-3 21:49:44 | 显示全部楼层
楼主不必这么早结帖,3楼的代码虽然能用,但是会有更好的,不要捡了芝麻丢了西瓜...
并且1楼的数据也“消失”了,随之代码也失去意义了
 楼主| 发表于 2024-12-3 22:03:42 | 显示全部楼层
本帖最后由 娜美 于 2024-12-3 22:24 编辑

回复 7# 77七

Ok, 我重新搞好了网盘连接,  这网盘连接好像有次数限制, 我重新换了另一个网盘连接,  所有文件仍然是一样的
    1楼的数据没有消失, 仍然是原样的, 是从1.txt复制出来的

大哥哥既然这样,  不妨再贴一个报告不符合条件那些文件名  , 3楼是符合条件结果

不符合条件结果
  1. 4.txt
  2. 5.txt
  3. 6.txt
  4. 7.txt
  5. 8.txt
  6. 9.txt
复制代码
 楼主| 发表于 2024-12-3 22:32:45 | 显示全部楼层
本帖最后由 娜美 于 2024-12-3 22:43 编辑
描述的不清不楚的
说是第2列时间在2秒时间内 ,但是看起来是第2列时间的差距 ,而且也没说清楚时间差距的比较方式 ,总不能随便找个时间差距2秒内的并且符合1..2..3..的区间吧
Five66 发表于 2024-12-3 19:14



计算时间就是符合在定义2秒内,  时间不用比较呢, 精确到秒就行。
只要第2列时间在符合定义2秒内,   第3列又有出现"1" 和 "3"数字(在定义2秒内)。就比较这2者它们的对应第5列数值是否相同

下载文件后, 可以打开其中一个文本内容,  对着1楼条件注释和标有红色样式看可能会容易明白些
发表于 2024-12-3 22:59:12 | 显示全部楼层
回复 8# 娜美


   3楼,24行改为 >>符合.txt echo %%x
37、38行之间添加
  1.         if not defined _"%%x" (
  2.                 >>不符合.txt echo %%x
  3.         )
复制代码
发表于 2024-12-4 13:02:21 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2024-12-4 13:04 编辑

秒级的时间间隔,计算到小时就足够了。代码也就简单多了。
如果秒只取到整数,小数直接舍去,不按常规的四舍五入:
  1. @echo off
  2. set D=2
  3. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  4.     setlocal enabledelayedexpansion
  5.     for /f "tokens=2,3,5 delims=        " %%a in ('type "%%i"') do (
  6.         if "%%b"=="1" (
  7.             set t=%%a
  8.             set n=%%b
  9.             set m=%%c
  10.         ) else if not "!x!"=="%%b" (
  11.             set n=!n!%%b
  12.             if "!n!"=="123" (
  13.                 if "%%c"=="!m!" (
  14.                     for /f "tokens=4-6 delims=:. " %%x in ("!t!") do (
  15.                         if "%%x"=="00" (set HH=24) else set HH=%%x
  16.                         set /a "t1=(1!HH!-100)*60*60+(1%%y-100)*60+1%%z-100+D"
  17.                     )
  18.                     for /f "tokens=4-6 delims=:. " %%x in ("%%a") do (
  19.                         if "%%x"=="00" (set HH=24) else set HH=%%x
  20.                         set /a "t2=(1!HH!-100)*60*60+(1%%y-100)*60+1%%z-100"
  21.                     )
  22.                     if !t1! geq !t2! set FN=%%i
  23.                 )
  24.             )
  25.         )
  26.         set x=%%b
  27.     )
  28.     if defined FN echo,!FN!
  29.     endlocal
  30. )
  31. pause
复制代码
考虑小数:
  1. @echo off
  2. set D=2
  3. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  4.     setlocal enabledelayedexpansion
  5.     for /f "tokens=2,3,5 delims=        " %%a in ('type "%%i"') do (
  6.         if "%%b"=="1" (
  7.             set t=%%a
  8.             set n=%%b
  9.             set m=%%c
  10.         ) else if not "!x!"=="%%b" (
  11.             set n=!n!%%b
  12.             if "!n!"=="123" (
  13.                 if "%%c"=="!m!" (
  14.                     for /f "tokens=4-7 delims=:. " %%w in ("!t!") do (
  15.                         if "%%w"=="00" (set HH=24) else set HH=%%w
  16.                         set /a "t1=(1!HH!-100)*60*60+(1%%x-100)*60+1%%y-100+D"
  17.                         set t3=%%z
  18.                     )
  19.                     for /f "tokens=4-7 delims=:. " %%w in ("%%a") do (
  20.                         if "%%w"=="00" (set HH=24) else set HH=%%w
  21.                         set /a "t2=(1!HH!-100)*60*60+(1%%x-100)*60+1%%y-100"
  22.                         set t4=%%z
  23.                     )
  24.                     if !t1! gtr !t2! (
  25.                         set FN=%%i
  26.                     ) else if !t1! equ !t2! (
  27.                         if !t3! geq !t4! set FN=%%i
  28.                     )
  29.                 )
  30.             )
  31.         )
  32.         set x=%%b
  33.     )
  34.     if defined FN echo,!FN!
  35.     endlocal
  36. )
  37. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
娜美 + 1

查看全部评分

 楼主| 发表于 2024-12-4 15:17:48 | 显示全部楼层
本帖最后由 娜美 于 2024-12-4 15:21 编辑
楼主不必这么早结帖,3楼的代码虽然能用,但是会有更好的,不要捡了芝麻丢了西瓜... ...
77七 发表于 2024-12-3 21:49


大哥哥说的对, 果然有更好在11楼出现啦

第3列的1至3之间除了只能是2   不能有其它数字, 但也不能没有2。   像这样是不符合
  1. 9        Nov 16, 2024 21:07:23.613688000 时间        1        0        5b50c
  2. 10        Nov 16, 2024 21:07:23.627698000 时间        2        0        7e400
  3. 20        Nov 16, 2024 21:07:23.663384000 时间        2        9        05b5
  4. 21        Nov 16, 2024 21:07:25.641368000 时间        1        9        5b50cd
  5. 22        Nov 16, 2024 21:07:25.718340000 时间        3        8        5b50cd
复制代码
发表于 2024-12-4 17:35:07 | 显示全部楼层
回复 12# 娜美


   3楼代码,13、14行之间加一行 set "mark="

评分

参与人数 1技术 +1 收起 理由
娜美 + 1 好了

查看全部评分

发表于 2024-12-4 19:20:57 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-12-4 19:39 编辑

回复 1# 娜美

以下批处代码(存于目标文件 *.txt 同目录运行)调用了 powershell 计算时间差,以便代码轻量化,代码第一行定义变量 td 为时间差上限=5秒,检查结果存入 “结果.lst” 文件,已用一楼提供的网盘示例文件集测试通过...

  1. @echo off &del/q "结果.lst" 2>nul &setlocal enabledelayedexpansion &set "td=5"
  2. for /f "delims=" %%F in ('dir /b/a-d *.txt') do (
  3.         call :check_3c "%%F"
  4.         if !ok! neq 0 (
  5.                 call :check_5c "%%F" ok
  6.                 if !ok! neq 0 (call :check_2c "%%F"))
  7.         if !ok! neq 0 (echo,%%F is qualified&echo,%%F>>"结果.lst")
  8. )
  9. pause&exit/b

  10. :check_3c
  11.    set/a "_c=0,ok=0"
  12.    for /f "usebackq tokens=3 delims=        " %%c in ("%~1") do (
  13.       set/a "_d=%%c-_c"
  14.       if %%c neq 1 if !_c! gtr %%c (exit/b) else if !_d! gtr 1 (exit/b)
  15.       set "_c=%%c")
  16.    set "ok=1"&exit/b
  17. :check_5c
  18.    for /f "usebackq tokens=1-5 delims=        " %%a in ("%~1") do (
  19.       if %%c equ 1 (set "v1=%%e") else if %%c equ 3 if /i "%%e" neq "!v1!" (set "%~2=0"&exit/b))
  20.    set "%~2=1"&exit/b
  21. :check_2c
  22.    set "ok=0" &set "tl=" &for /f "usebackq tokens=2 delims=        " %%t in ("%~1") do (
  23.       for /f "delims=" %%a in ("%%t") do (
  24.          if defined t1 (set "t2=%%a" &if /i "!t1:~,12!" neq "!t2:~,12!" exit/b) else set "t1=%%a"
  25.          set "_t=%%a" &set tl=!tl!,'!_t:~13,8!'))
  26.    for /f %%v in ('powershell "$t=!tl:~1!|measure -min -max;(new-timespan -start $t.minimum -end $t.maximum).seconds" ') do if %%v gtr !td! exit/b
  27.    set "ok=1"&exit/b
复制代码

评分

参与人数 1技术 +1 收起 理由
娜美 + 1

查看全部评分

 楼主| 发表于 2024-12-4 21:13:31 | 显示全部楼层
多谢各位哥哥了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 14:50 , Processed in 0.026222 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表