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

[挑战] 批处理寻找所有条件里相同的数字

假设有如下数字:

2190717
219117
2199817
2190517
2191417
21921917

为了大量数据统计的需要,我用一句话生成类似的数据
for /l %%i in (1,1,100) do echo 219%%i17>>1.txt

在这堆数据里,都有 219 的前缀和 17 的后缀,而中间的数据是随机的。

现在,我们的题目来了:
       利用批处理,找出 219 的前缀 和  17 的后缀,并将去掉后的结果输出到2.txt

输出的结果类似:
1
2
3
……
100

      前提:219 和 17在题目中是未知的,所以我们需要找出这2个未知的数据。。(这也是这里的难点)

有意思的题目,好好想想。。。
心绪平和,眼藏静谧。

TOP

写了个删除前缀的(后缀亦然),效率不怎么高:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p str=<1.txt
  3. :lp
  4. for /f "delims=" %%i in ('findstr "%var%%str:~,1%" 1.txt') do set /a n+=1
  5. if not defined num set "num=%n%"
  6. if "%n%" equ "%num%" (
  7.    set "var=%var%%str:~,1%"&set "str=%str:~1%"
  8.    set "n=0"&goto lp
  9. )
  10. for /f "delims=" %%i in (1.txt) do (
  11.     set "str=%%i"
  12.     echo !str:%var%=!
  13. )
  14. pause>nul
复制代码
***共同提高***

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. set /p str=<a.txt
  3. set /a n=-1
  4. :loop
  5. set/a n+=1
  6. for /f "delims=" %%a in (a.txt) do (
  7.      set "var=%%a"
  8.      if "!var:~%n%,1!" neq "!str:~%n%,1!" set "x=%n%"
  9.      set "str=%%a"
  10. )
  11. if not defined x goto loop
  12. for /f "delims=" %%i in (a.txt) do (
  13.      set "var=%%i"
  14.      echo !var:~%x%!
  15. )
  16. pause
复制代码
也来一个,同样只是去掉前缀。输出结果跟batman版主的代码有点出入。
1

评分人数

心绪平和,眼藏静谧。

TOP

思维定向了,一直想先把前缀提出来,pusofalse版主的代码证明了并不要提出来。
***共同提高***

TOP

再修改下,能正确输出1,2,3、、、、100。
  1. @echo off&setlocal enabledelayedexpansion
  2. cd.>a.txt
  3. set/a r=%random%,d=!random!,n=-1
  4. for /l %%a in (1 1 100) do set "_!random!!random!=%r%%%a%d%"
  5. for /f "tokens=2 delims==" %%i in ('set _') do echo>>a.txt %%i
  6. set /p str=<a.txt
  7. :loop
  8. set/a n+=1,m+=1
  9. for /f "delims=" %%a in (a.txt) do (
  10.      set "var=%%a"
  11.      if "!var:~%n%,1!" neq "!str:~%n%,1!" if not defined x set "x=%n%"
  12.      if "!var:~-%m%,1!" neq "!str:~-%m%,1!" if not defined y set "y=%m%"
  13.      set "str=%%a"
  14. )
  15. for %%a in (x y) do if not defined %%a goto loop
  16. set/a y-=1
  17. for /f "delims=" %%i in (a.txt) do (
  18.      set "var=%%i"
  19.      echo !var:~%x%,-%y%!
  20. )
  21. pause>nul
复制代码

[ 本帖最后由 pusofalse 于 2008-10-17 18:28 编辑 ]
心绪平和,眼藏静谧。

TOP

我在思考一个问题,或者询问楼主:
在这里,究竟是人工识别前缀还是要求自动识别?

TOP

原帖由 youxi01 于 2008-10-17 19:16 发表
我在思考一个问题,或者询问楼主:
在这里,究竟是人工识别前缀还是要求自动识别?

当然是自动识别前缀和后缀来呀。。

若是人工识别,这个题目就没有难度了。。

这个是对字符串知识的一次总结。。

TOP

:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p var=<a.txt
  3. set q=%var:~0,1%
  4. set h=%var:~-1%
  5. for /f "delims=:" %%a in ('findstr /n "." a.txt') do set /a z=%%a
  6. :loop
  7. for /f "delims=:" %%a in ('findstr /n "^%q%" a.txt') do set /a x=%%a
  8. if %x% equ %z% (
  9.    set /a m+=1
  10.    set "q=!q!!var:~1,1!"
  11.    set "var=!var:~1!"
  12.    goto loop
  13. )
  14. :loop2
  15. for /f "delims=:" %%a in ('findstr /n "%h%$" a.txt') do set /a x=%%a
  16. if %x% equ %z% (
  17.    set /a j+=1&set var=!var:~0,-1!
  18.    set h=!var:~-1,1!!h!
  19.    goto loop2
  20. )
  21. for /f "delims=" %%a in (a.txt) do (
  22.    set "str=%%a"
  23.    echo !str:~%m%,-%j%!
  24. )
  25. pause
复制代码
技术问题请到论坛发帖求助!

TOP

  既然前缀和后缀是未知的,又怎么找得出来呢?楼主提供的条件让人不解,难道是说,如果前缀和后缀重复的次数达到一定次数之后,就要把这些数据过滤掉?
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

和JM有相同的疑问,假如有下面的数据:
2190717
2190117
2190117
2193117
2191117
这要比较很多组才能判断出正确的前缀和后缀吧?效率很难保证
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

同楼上
个人感觉,在这方面,机器的效率还是比不上人脑的

TOP

我觉得楼主的意思还是表明清楚了,这个每行的前缀和后缀也是能通过程度自动判断出来
的,但用纯批处理来完成这样一个过程必定存在效率问题,因为用批肯定是要进行逐字符
判断的,当遇到大型的文本时,这样的处理将会慢得不可形容。所以,这样的题目其实际
价值并不会太大。。。
***共同提高***

TOP

  楼主的意思并没有表明清楚,因为楼主并没有说清楚什么样的字符串才算前缀,什么样的字符串才算后缀,既然前缀后缀的含义都没有交代清楚,又怎么能让程序判断哪些是前缀哪些是后缀呢——楼主已经注明了,219和17仅仅是举例,它们是未知的,是需要通过程序来判断,这是问题的关键。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

据pusofalse四楼代码而改

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. call :loop n-1 fx
  4. call :loop -n lx
  5. set/a fx=fx,lx=lx+1
  6. for /f "delims=" %%i in (1.txt) do (
  7.      set "var=%%i"
  8.      echo !var:~%fx%,%lx%!
  9. )
  10. pause
  11. goto :eof
  12. :loop
  13. set/a n+=1
  14. set/a m=%1
  15. for /f "delims=" %%a in (1.txt) do (
  16.      set "var=%%a"
  17.      if not "!str!"=="" if not "!str:~%m%,1!"=="!var:~%m%,1!" set "%2=%m%"
  18.      set "str=%%a"
  19. )
  20. if not defined %2 goto loop
  21. set n=
复制代码

TOP

返回列表