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

【练习-042】批处理将文本数值按尾数分类

[复制链接]
 楼主| 发表于 2009-4-14 08:08:35 | 显示全部楼层
向各献丑了,变量赋值法:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (0,1,9) do (
  3.     for /f "delims=" %%b in (b.txt) do (
  4.          for %%c in (%%b) do (
  5.               set /a num=%%c-%%a,num=num%%10
  6.               if !num! equ 0 set "_%%a=!_%%a! %%c"
  7.          )
  8.     )
  9. )
  10. for /f "tokens=1,2 delims==_" %%a in ('set _') do (
  11.      set /p=%%a <nul&setlocal enabledelayedexpansion
  12.      for %%c in (%%b) do (
  13.           set "str=000%%c"&set "str=!str:~-3!"
  14.             if defined #!str! (
  15.             call,set "#!str!=%%#!str!%% %%c"
  16.             ) else (
  17.             set "#!str!=%%c"  
  18.         )
  19.      )
  20.      for /f "tokens=2 delims==" %%d in ('set #') do set /p=%%d <nul
  21.      echo.&endlocal
  22. )  
  23. pause>nul
复制代码

评分

参与人数 2PB +32 收起 理由
tyc + 2 利用set ,有点投机取巧的
rat + 30 够简洁,但效率……

查看全部评分

 楼主| 发表于 2009-4-14 08:13:33 | 显示全部楼层
感觉还可以优化,两个大循环可以合并,要开会了,占下位子先。。。
发表于 2009-4-14 09:39:18 | 显示全部楼层
原帖由 terse 于 2009-4-13 17:10 发表
先抛砖 感觉可以少个FOR@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (
   for %%j in (%%i) do (
       set str=%%j
       for /l %%a in (0,1,9) do (
       if "!str: ...



set真是用的经典,学习了。
发表于 2009-4-14 09:56:19 | 显示全部楼层
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. for /l %%i in (0,1,9) do set "n%%i=%%i"
  4. for /f "delims=" %%a in (1.txt) do (
  5.         for %%b in (%%a) do (
  6.                 set num=%%b
  7.                 set re=n!num:~-1!
  8.                 call set "!re!=%%!re!%% %%b"
  9.                 )
  10.         )
  11. for /l %%p in (0,1,9) do call echo %%n%%p%%
  12. pause
  13. goto :eof
复制代码
好了  今天来给我昨天那个稍微改了下  可以了  HOHO

评分

参与人数 1PB +5 收起 理由
batman + 5 请继续优化

查看全部评分

发表于 2009-4-14 10:12:16 | 显示全部楼层
原帖由 terse 于 2009-4-13 17:10 发表
先抛砖 感觉可以少个FOR

虽然少个FOR 但CALL的效率不知道怎么样
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do (
  3.    for %%j in (%%i) do (
  4.        set str=%%j
  5.        call set _!str:~-1!=%%_!str:~-1!%% %%j
  6. ))
  7. for /l %%a in (0,1,9) do if not "!_%%a!"=="" echo %%a!_%%a!
  8. pause
复制代码

评分

参与人数 1PB +5 收起 理由
随风 + 5

查看全部评分

发表于 2009-4-14 10:29:47 | 显示全部楼层

回复 23楼 的帖子

call 的效率比 for 差。(命令耗时清单)

以下是用 timeit.exe 测出的结果:
Average for terse.bat key over 5 runs

Version Number:&#160; &#160;Windows NT 5.1 (Build 2600)
Exit Time:&#160; &#160;&#160; &#160; &#160;10:32 am, Tuesday, April 14 2009
Elapsed Time:&#160; &#160;&#160;&#160;0:00:00.056
Process Time:&#160; &#160;&#160;&#160;0:00:00.062

System Calls:&#160; &#160;&#160;&#160;5282
Context Switches: 327
Page Faults:&#160; &#160;&#160; &#160;586
Bytes Read:&#160; &#160;&#160; &#160; 17129
Bytes Written:&#160; &#160; 0
Bytes Other:&#160; &#160;&#160; &#160;72752


Average for terse_call.bat key over 5 runs

Version Number:&#160; &#160;Windows NT 5.1 (Build 2600)
Exit Time:&#160; &#160;&#160; &#160; &#160;10:32 am, Tuesday, April 14 2009
Elapsed Time:&#160; &#160;&#160;&#160;0:00:00.143
Process Time:&#160; &#160;&#160;&#160;0:00:00.156

System Calls:&#160; &#160;&#160;&#160;4479
Context Switches: 658
Page Faults:&#160; &#160;&#160; &#160;688
Bytes Read:&#160; &#160;&#160; &#160; 23031
Bytes Written:&#160; &#160; 6220
Bytes Other:&#160; &#160;&#160; &#160;78810

[ 本帖最后由 tireless 于 2009-4-14 10:32 编辑 ]
 楼主| 发表于 2009-4-14 10:37:22 | 显示全部楼层
原帖由 terse 于 2009-4-14 10:12 发表

虽然少个FOR 但CALL的效率不知道怎么样
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (
   for %%j in (%%i) do (
       set str=%%j
       call set _!str:~-1!=%%_!st ...

怎么不加上排序?
发表于 2009-4-14 11:32:09 | 显示全部楼层
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. md l100
  4. md g100
  5. for /l %%i in (0,1,9) do set "n%%i=%%i"
  6. for /f "delims=" %%a in (1.txt) do (
  7.         for %%b in (%%a) do (
  8.                 if %%b lss 100 (echo off >l100/%%b) else (echo off >g100/%%b)
  9.                 )
  10.         )
  11. dir /o:n /b l100 >>result.txt
  12. dir /o:n /b g100 >>result.txt
  13. for /f %%m in (result.txt) do (
  14.         set num=%%m
  15.         set re=n!num:~-1!
  16.         call set "!re!=%%!re!%% %%m"
  17.         )
  18. for /l %%p in (0,1,9) do call echo %%n%%p%%
  19. rd /s /q l100
  20. rd /s /q g100
  21. del result.txt
  22. pause
  23. goto :eof
复制代码
昨天没看到有排序的要求  HOHO  现在写好了   新手   给点鼓励
 楼主| 发表于 2009-4-14 11:37:35 | 显示全部楼层
将我19楼的代码简化并提效如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (0,1,9) do (
  3.     for /f "delims=" %%b in (b.txt) do (
  4.          for %%c in (%%b) do (
  5.               set /a num=%%c-%%a,num=num%%10
  6.               if !num! equ 0 (
  7.                  set "str=000%%c"&set "str=%%a!str:~-3!"
  8.                  if defined _!str! (
  9.                    call,set "_!str!=%%_!str!%% %%c"
  10.                    ) else (
  11.                    set "_!str!=%%c"
  12.                  )
  13.                )        
  14.           )
  15.      )
  16. )
  17. for /f "tokens=1,2 delims==_" %%a in ('set _') do (
  18.      set "str=%%a"&set "str=!str:~,1!"
  19.      if not defined !str! (
  20.        echo.&set /p=!str! %%b <nul&set "!str!=a"
  21.        ) else (
  22.        set /p=%%b <nul
  23.      )
  24. )
  25. pause>nul
复制代码

评分

参与人数 1PB +30 收起 理由
rat + 30 够简洁,但效率……

查看全部评分

 楼主| 发表于 2009-4-14 11:54:37 | 显示全部楼层
17、18楼的代码都有问题,请nanhui兄弟仔细对照题目要求测试和检查,你24楼的写得太罗索,我就没仔细看了。

[ 本帖最后由 batman 于 2009-4-14 11:57 编辑 ]
发表于 2009-4-14 13:11:03 | 显示全部楼层

回复 28楼 的帖子

写错了,效率挺好的,学习
发表于 2009-4-14 16:39:40 | 显示全部楼层
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=*" %%a in (a.txt) do (
  3.   for %%i in (%%a) do set "var=00%%i" & echo !var:~-3!
  4. ))>a_tmp.txt

  5. for /f "tokens=* delims=0" %%a in ('sort a_tmp.txt') do (
  6.   set var=%%a
  7.   for %%i in (#!var:~-1!) do (
  8.     set "var=!%%i! "
  9.     if "!var: %%a =!"=="!var!" set %%i=!%%i! %%a
  10.   )
  11. )

  12. for /l %%a in (0 1 9) do if defined #%%a echo %%a!#%%a!
  13. del a_tmp.txt & pause
复制代码
 楼主| 发表于 2009-4-14 19:45:11 | 显示全部楼层
楼上是否有点考虑欠妥了,好像没有处理数值相同的情况!

[ 本帖最后由 batman 于 2009-4-14 19:56 编辑 ]
发表于 2009-4-14 20:22:19 | 显示全部楼层

回复 32楼 的帖子

处理了                                                                                                                   .
 楼主| 发表于 2009-4-14 20:36:30 | 显示全部楼层
你楼上的代码没有处理,如果处理就要在下面这句中用if来处理:
for %%i in (%%a) do set "var=00%%i" & echo !var:~-3!
你这样就是将相同值多次赋值,只保留下最后的一次赋值,也就
是说无论数字中有多少个值相同,结果也只会有一个数字被输出
,如下面这一段代码:
  1. @echo off
  2. for %%a in (1 1 2 3 3 4 4) do set "_%%a=%%a"
  3. set _
  4. pause>nul
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 05:06 , Processed in 0.027118 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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