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

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

[复制链接]
发表于 2008-8-31 14:51:37 | 显示全部楼层 |阅读模式
前些天在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 编辑 ]
发表于 2008-8-31 19:13:20 | 显示全部楼层

从小到大排列


这句话应该说清楚:按各段落文字第一列数字大小顺序排列!
如:....
 楼主| 发表于 2008-8-31 19:16:42 | 显示全部楼层

回复 2楼 的帖子

谢谢指正,已经修改!
发表于 2008-8-31 20:02:50 | 显示全部楼层
先发个粗糙的 感觉可以精简
  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 编辑 ]

评分

参与人数 1PB +8 收起 理由
pusofalse + 8 精品文章

查看全部评分

 楼主| 发表于 2008-8-31 20:14:46 | 显示全部楼层

回复 4楼 的帖子

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

试用sort  没成功
进了胡同

[ 本帖最后由 terse 于 2008-8-31 20:49 编辑 ]
 楼主| 发表于 2008-8-31 20:57:59 | 显示全部楼层
我也用过sort,也没成功,可能还是思路不畅,同是用set来排的。
似乎都考虑到了这题只是合并第一个序号到第二个序号上一行的内容为一个变量,最后set自动排序。只是方法不同~
发表于 2008-8-31 22:12:29 | 显示全部楼层

来凑下热闹

  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   
复制代码

评分

参与人数 1PB +8 收起 理由
pusofalse + 8 精品文章

查看全部评分

发表于 2008-8-31 22:13:52 | 显示全部楼层
晕,贴出来才发现和terse的如同一辙。。。
发表于 2008-8-31 22:27:46 | 显示全部楼层
"只是合并第一个序号到第二个序号上一行的内容为一个变量"

不知道斑竹如何能够使一个回车能在set环境变量中存在?
 楼主| 发表于 2008-8-31 22:56:14 | 显示全部楼层

回复 10楼 的帖子

兄所说的这种情况,恐怕是绝对不可能。或者误解我的意思了。
set var%n%=A012 Exa Explosive Weird Admission
for %%a in (!var%n%!) do echo %%a
发表于 2008-8-31 23:03:33 | 显示全部楼层
好象段中的字也空格的吧,这样写不会将字分开了吗
 楼主| 发表于 2008-8-31 23:05:45 | 显示全部楼层
是分开了,加个"闭合就可以了啊。
 楼主| 发表于 2008-9-1 21:23:26 | 显示全部楼层
这题果真难倒了新手吗,期待新手解答出此题。以下,本人的解,期待更加简洁的解。
  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
复制代码

评分

参与人数 2PB +17 收起 理由
keen + 7 强!简洁!!!
batman + 10 简洁得好

查看全部评分

发表于 2008-9-2 01:32:54 | 显示全部楼层
哦.看来只有另外想办法了....

利用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 编辑 ]

评分

参与人数 1PB +5 收起 理由
pusofalse + 5 兄的水平不只是如此而已。

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 01:59 , Processed in 0.027094 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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