[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
回复 15# qixiaobin0715


   大佬,这个比重命名复杂多了,我写不出来。
bat小白,请多指教!谢谢!

TOP

本帖最后由 qixiaobin0715 于 2024-9-6 14:09 编辑

回复 16# 77七
是挺复杂的,我现在也没有写出来
但思路有了。
分别从上到下统计符合要求的数值连续出现的次数。
需要分级设定锚点:
第1级,如果出现不符合数值(小于10且大于6),所有的先前统计次数均要清零,从下一行开始重新统计;
第2级,对于出现大于等于10的数值。
          如果首次出现,向上追溯,如果最近3行不是连续数值小于等于6,所有的统计次数均要清零,重新统计;
          如果连续出现多于4次,所有的统计次数均要清零,重新统计;
第3级,对于出现小于或等于-2的数值的情况。
          如果首次出现,向上追溯,如果第2级未通过(即次数为1-3),所有的统计次数均要清零,将本次数值统计到小于等于6的次数中;
应当还有一些要考虑的细节,较为繁琐,不再一一罗列。大致就是这样。
可能还有更好的思路。

TOP

本帖最后由 qixiaobin0715 于 2024-9-6 17:09 编辑

回复 16# 77七
烧脑的if判断语句!!!
可能会有bug。
x变量分别表示设定的连续数值出现的次数;
n变量分别表示实际的连续数值动态出现的次数;
  1. @echo off
  2. set /a x1=3,x2=4,x3=3
  3. set /a n1=n2=n3=0
  4. setlocal enabledelayedexpansion
  5. for /f "tokens=1* delims=," %%i in (a.txt) do (
  6.     if %%j geq 10 (
  7.         if !n1! lss !x1! (
  8.             set /a n1=n2=n3=0
  9.         ) else (
  10.             if !n3! neq 0 (
  11.                 set /a n1=n2=n3=0
  12.             ) else (
  13.                 set /a n2+=1
  14.                 if !n2! gtr !x2! set /a n1=n2=n3=0
  15.             )
  16.         )
  17.     ) else if %%j leq 6 (
  18.         if !n2! equ 0 (
  19.             set /a n1+=1
  20.         ) else (
  21.             if !n2! equ !x2! (
  22.                 if %%j leq -2 (
  23.                     set /a n3+=1
  24.                     if !n3! equ !x3! (
  25.                         set /a m=%%i-10+1
  26.                         echo,!m!-%%i
  27.                         set /a n1=n3
  28.                         set /a n2=n3=0
  29.                     )
  30.                 ) else (
  31.                     set /a n1=n3+1
  32.                     set /a n2=n3=0
  33.                 )
  34.             ) else (
  35.                 set /a n1=1
  36.                 set /a n2=0
  37.             )
  38.         )
  39.     ) else (
  40.         set /a n1=n2=n3=0
  41.     )
  42. )
  43. pause
复制代码
还没想到更简单的方法,现在只能这样了。
写代码的过程中发现,考虑实际问题时和17楼的思路还是有很大的差异,上下左右都有牵扯,有一点考虑不到就会出问题。
1

评分人数

TOP

回复 18# qixiaobin0715


   
谢谢大佬分享!确实太复杂了,和出题挑战区的数学题目一样,反正我暂时不想想这个。
bat小白,请多指教!谢谢!

TOP

本帖最后由 aloha20200628 于 2024-9-6 21:33 编辑

回复 15# qixiaobin0715

幸亏能用一串 ‘逻辑与’ 的 if 句式
假设35个数用如下格式存于 1.txt
1,8
2,-8
3,5
4,0
5,25
6,30
7,18
8,50
9,-12
10,-22
11,-5
12,4
13,11
14,20
15,55
16,33
17,-22
18,-10
19,-3
20,10
21,9
22,5
23,0
24,-5
25,14
26,22
27,50
28,89
29,-9
30,-33
31,-12
32,-66
33,8
34,-9
35,8
  1. @echo off &setlocal enabledelayedexpansion
  2. for /f "tokens=1,2 delims=, " %%a in (1.txt) do set/a "n+=1" &set "_%%a=%%b"
  3. set/a "k=!n!-9"
  4. for /l %%n in (1,1,!k!) do (
  5. set/a "m=%%n+9,i=1"
  6. for /l %%v in (%%n,1,!m!) do set "$!i!=!_%%v!" &set/a "i+=1"
  7. if !$1! leq 6 if !$2! leq 6 if !$3! leq 6 if !$4! geq 10 if !$5! geq 10 if !$6! geq 10 if !$7! geq 10 if !$8! leq -2 if !$9! leq -2 if !$10! leq -2 (
  8. echo,同时满足3个条件的10个连续数(行号)= {%%n-!m!}
  9. )
  10. )
  11. endlocal&pause&exit/b
复制代码
2

评分人数

TOP

回复 15# qixiaobin0715


    这个也可以用迭代法
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a n=n1=n2=n3=p=0
  4. :loop
  5. set /a p+=1
  6. setlocal
  7. for /f "%skip%tokens=1-2 delims=," %%i in (1.txt) do (
  8.     set /a n+=1
  9.     if %%j leq 6 (
  10.         if !n! leq 3 set /a n1+=1
  11.         if !n! equ 1 set "s=%%i"
  12.         )
  13.     if %%j geq 10 if !n! geq 4 if !n! leq 7 set /a n2+=1
  14.     if %%j leq -2 if !n! geq 8 set /a n3+=1
  15.     if !n! equ 10 (
  16.         rem echo,!n1!,!n2!,!n3!
  17.         if !n1! equ 3 if !n2! equ 4 if !n3! equ 3 echo,!s!-%%i
  18.         endlocal&set "skip=skip=%p%"&goto :loop
  19.         )
  20.     )
  21. pause&exit
复制代码

TOP

本帖最后由 qixiaobin0715 于 2024-9-9 09:29 编辑

实际上20、21楼的代码都是迭代法,20楼是逐行错位迭代。虽然在这里与15楼的“if到底”的要求不是太合辙,看样子迭代法是解决此类问题的其中一个捷径。
如果要用迭代法的话还是原贴中那位大佬代码更简洁,直接原地迭代:
  1. set a1=!a2!
  2. set a2=!a3!
  3. ...
  4. set a9=!a10!
  5. set a10=%%b
  6. if defined a1 if !a1! leq 6 if !a2! leq 6...
复制代码
后面部分和20楼差不多。

TOP

本帖最后由 qixiaobin0715 于 2024-9-11 11:57 编辑

回复 21# buyiyang
每次读取10行文本就跳转感觉有点浪费,这样是否要节约些:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a n=n1=n2=n3=p=0
  4. :loop
  5. set /a p+=1
  6. setlocal
  7. for /f "%skip%tokens=1-2 delims=," %%i in (a.txt) do (
  8.     set /a n+=1
  9.     if %%j leq 6 (
  10.         if !n! leq 3 set /a n1+=1
  11.         if !n! equ 1 set "s=%%i"
  12.         )
  13.     if %%j geq 10 if !n! geq 4 if !n! leq 7 set /a n2+=1
  14.     if %%j leq -2 if !n! geq 8 set /a n3+=1
  15.     if !n! equ 10 (
  16.         rem echo,!n1!,!n2!,!n3!
  17.         if !n1! equ 3 if !n2! equ 4 if !n3! equ 3 echo,!s!-%%i
  18.         )
  19.     if !n! equ 10 set /a n=n1=n2=n3=p=0
  20.     )
  21. endlocal
  22. set "skip=skip=%p%"
  23. if %p% lss 10 goto :loop
  24. pause&exit
复制代码

TOP

回复 11# aloha20200628
实际上对于本题来说,只是处理几千条信息而已,效率问题可以忽略。
退一步来说,在for循环中反复调用第三方也会拖累一定的处理速度。在for循环外使用第三方生成临时文件,再用for循环读取临时文件可能效率会更高一些。

TOP

本帖最后由 aloha20200628 于 2024-9-9 11:49 编辑

回复 24# qixiaobin0715

      其实众人给求助者的绝大部分代码都假定是处理小数据,dir和那些便于预装的第三方操作就顺便直接放在 for ... () 的命令表达式中,不用临时文件以免代码倒腾...
      个人经验是当被处理数据过千行就一定采用临时文件的方法,跳出 for...() 的狭窄 ‘管道井’,尤其是对硬件配置较低的实况,而一旦如此,那些被c/c++打造的第三方会充分发挥速度优势,是纯P代码远所不及的,因此能用此法叫第三方代劳越多,整个批处脚本的效率就会越高...

TOP

cmd本身就不适合处理较为复杂的或者数据量较大的问题,即使加入第三方。

TOP

本帖最后由 qixiaobin0715 于 2024-9-9 16:34 编辑

这样与18楼代码相比要简单一些:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1* delims=," %%i in (a.txt) do (
  4.     if %%j geq 10 (
  5.         set a=!a!3
  6.     ) else if %%j leq -2 (
  7.         set a=!a!1
  8.         if "!a:~-7!"=="3333111" (
  9.             if not "!a:~9!"=="" (
  10.                 set b=!a:~,3!
  11.                 set b=!b:2=!
  12.                 if "!b:1=!"=="" (
  13.                     set /a n=%%i-10+1
  14.                     echo,!n!-%%i
  15.                 )
  16.             )
  17.         )
  18.     ) else if %%j leq 6 (
  19.         set a=!a!2
  20.     ) else (
  21.         set a=!a!4
  22.     )
  23.     set a=!a:~-9!
  24. )
  25. pause
复制代码

TOP

简化一下楼上代码:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1* delims=," %%i in (a.txt) do (
  4.     if %%j geq 10 (
  5.         set a=!a!3
  6.     ) else if %%j leq -2 (
  7.         set a=!a!1
  8.         if "!a:~-7!"=="3333111" (
  9.             if "!a:2=1!"=="1113333111" (
  10.                 set /a n=%%i-10+1
  11.                 echo,!n!-%%i
  12.             )
  13.         )
  14.     ) else if %%j leq 6 (
  15.         set a=!a!2
  16.     ) else (
  17.         set a=!a!4
  18.     )
  19.     set a=!a:~-9!
  20. )
  21. pause
复制代码

TOP

返回列表