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

【练习-019】批处理顺序排列文本内容

前些天在CN-DOS翻老帖,看到如此的一个题目,又加深了一点难度,有兴趣的来做下。
加分规则:
1.思路独特 5分
2.代码高效、通用 4分
3.技巧高超 4分
4.代码简洁 2分
5.完美代码 15分
题目如下:
a.txt内容:
  1. A111
  2. Assure
  3. Cons tant
  4. Smail
  5. A012
  6. Exa
  7. Explosive
  8. Weird
  9. Admission
  10. A077
  11. Chant
  12. Reli gious
  13. Praise
  14. Rhyming
  15. Parsley
  16. A034
  17. Faith
  18. Zealous
  19. Absorb
  20. Principle
复制代码
按照段落序号从小到大顺序排列,如下:
  1. A012
  2. Exa
  3. Explosive
  4. Weird
  5. Admission
  6. A034
  7. Faith
  8. Zealous
  9. Absorb
  10. Principle
  11. A077
  12. Chant
  13. Reli gious
  14. Praise
  15. Rhyming
  16. Parsley
  17. A111
  18. Assure
  19. Cons tant
  20. Smail
复制代码
每段的单词个数未知,在单词随机处有空格。
段落序号A之后的数字总是3位,若不够三位,则在前面加0表示。
A077,而不是A77。A034,而不是A34

[ 本帖最后由 pusofalse 于 2008-8-31 21:32 编辑 ]
心绪平和,眼藏静谧。


从小到大排列


这句话应该说清楚:按各段落文字第一列数字大小顺序排列!
如:....

TOP

回复 2楼 的帖子

谢谢指正,已经修改!
心绪平和,眼藏静谧。

TOP

先发个粗糙的 感觉可以精简
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1* delims=:" %%i in ('findstr /n .* "1.txt"') do (
  3.     if "%%j"=="" (
  4.     for /f "tokens=1* delims=#" %%a in ("!str!") do (
  5.     set .%%a=%%a#%%b&set str=
  6.     ))
  7.     if defined str (set str=!str!#%%j)else set str=%%j
  8.     )
  9. for /f "tokens=1* delims=#" %%a in ("!str!") do set .%%a=%%a#%%b
  10. for /f "tokens=2 delims==" %%i in ('set .') do (
  11.     set str=%%i
  12.     set "str=!str:#=&echo.!"
  13.     call:lp
  14.     )
  15. pause&exit
  16. :lp
  17. echo %str%
  18. echo.
复制代码

再改就这样  没突破  下面继续吧
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1* delims=:" %%i in ('findstr /n .* "1.txt"') do (
  3.     if not "%%j"=="" (if defined str (set str=!str!#%%j)else set str=%%j)else set .!str!=ok&set str=
  4.     )
  5.     set .!str!=ok
  6.     for /f "tokens=1 delims=.=" %%i in ('set .') do (
  7.     set str=%%i
  8.     set "str=!str:#=&echo.!"
  9.     call:lp
  10.     )
  11.     pause&exit
  12. :lp
  13. echo %str%
  14. echo.
复制代码

[ 本帖最后由 terse 于 2008-8-31 20:39 编辑 ]
1

评分人数

TOP

回复 4楼 的帖子

刚看到这题时我感觉有点无从下手,但那只是被这题的外表所迷惑了而已。
感觉terse前辈考虑的有点过于复杂了。
心绪平和,眼藏静谧。

TOP

原帖由 pusofalse 于 2008-8-31 20:14 发表
刚看到这题时我感觉有点无从下手,但那只是被这题的外表所迷惑了而已。
感觉terse前辈考虑的有点过于复杂了。

试用sort  没成功
进了胡同

[ 本帖最后由 terse 于 2008-8-31 20:49 编辑 ]

TOP

我也用过sort,也没成功,可能还是思路不畅,同是用set来排的。
似乎都考虑到了这题只是合并第一个序号到第二个序号上一行的内容为一个变量,最后set自动排序。只是方法不同~
心绪平和,眼藏静谧。

TOP

来凑下热闹

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2 delims=:" %%i in ('findstr /n .* a.txt') do (
  3.     if not defined flag (
  4.        set "a=%%j"&set "flag=a"
  5.        ) else (
  6.        if "%%j" neq "" (
  7.           call,set "_!a!=%%_!a!%% "%%j""
  8.           ) else (
  9.           set "flag="  
  10.        )
  11.     )
  12. )
  13. for /f "tokens=1,2 delims==" %%a in ('set _') do (
  14.     echo %%a
  15.     for %%i in (%%b) do echo %%~i
  16.     echo.
  17. )
  18. pause>nul   
复制代码
1

评分人数

***共同提高***

TOP

晕,贴出来才发现和terse的如同一辙。。。
***共同提高***

TOP

"只是合并第一个序号到第二个序号上一行的内容为一个变量"

不知道斑竹如何能够使一个回车能在set环境变量中存在?

TOP

回复 10楼 的帖子

兄所说的这种情况,恐怕是绝对不可能。或者误解我的意思了。
set var%n%=A012 Exa Explosive Weird Admission
for %%a in (!var%n%!) do echo %%a
心绪平和,眼藏静谧。

TOP

好象段中的字也空格的吧,这样写不会将字分开了吗

TOP

是分开了,加个"闭合就可以了啊。
心绪平和,眼藏静谧。

TOP

这题果真难倒了新手吗,期待新手解答出此题。以下,本人的解,期待更加简洁的解。
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do (
  3.      set "var=%%a"
  4.      if "!var:~1,1!" leq "9" set "str=%%a"
  5.      call set ".!str!=%%.!str!%%"%%a" "
  6. )
  7. for /f "tokens=2 delims==" %%a in ('set .') do (
  8.      for %%i in (%%a) do echo %%~i
  9.      echo.
  10. )
  11. pause
复制代码
2

评分人数

    • keen: 强!简洁!!!PB + 7
    • batman: 简洁得好PB + 10
心绪平和,眼藏静谧。

TOP

哦.看来只有另外想办法了....

利用skip吧..
  1. @echo off
  2. for /f "tokens=* " %%m in ('findstr /r "^A[0-9][0-9][0-9]$" 1.txt ^| sort /+1') do (
  3.         for /f "delims=: tokens=1,2 " %%i in ('findstr /n /r "^A[0-9][0-9][0-9]$" 1.txt') do if "%%j"=="%%m" echo %%m & call :loop %%i
  4.         echo.
  5.         )
  6. goto :exit
  7. :loop
  8.         for /f "skip=%1 tokens=* " %%n in (1.txt) do (
  9.                 echo %%n| findstr /r "^A[0-9][0-9][0-9]$">nul
  10.                 if not errorlevel 1 goto :EOF
  11.                 echo %%n
  12.                 )
  13.         goto :EOF
  14. :exit
  15. pause
复制代码

[ 本帖最后由 flyinspace 于 2008-9-3 14:59 编辑 ]
1

评分人数

    • pusofalse: 兄的水平不只是如此而已。PB + 5

TOP

返回列表