标题: 【练习-019】批处理顺序排列文本内容 [打印本页]
作者: pusofalse 时间: 2008-8-31 14:51 标题: 【练习-019】批处理顺序排列文本内容
前些天在CN-DOS翻老帖,看到如此的一个题目,又加深了一点难度,有兴趣的来做下。
加分规则:
1.思路独特 5分
2.代码高效、通用 4分
3.技巧高超 4分
4.代码简洁 2分
5.完美代码 15分
题目如下:
a.txt内容:- A111
- Assure
- Cons tant
- Smail
-
- A012
- Exa
- Explosive
- Weird
- Admission
-
- A077
- Chant
- Reli gious
- Praise
- Rhyming
- Parsley
-
- A034
- Faith
- Zealous
- Absorb
- Principle
复制代码
按照段落序号从小到大顺序排列,如下:- A012
- Exa
- Explosive
- Weird
- Admission
-
- A034
- Faith
- Zealous
- Absorb
- Principle
-
- A077
- Chant
- Reli gious
- Praise
- Rhyming
- Parsley
-
- A111
- Assure
- Cons tant
- Smail
复制代码
每段的单词个数未知,在单词随机处有空格。
段落序号A之后的数字总是3位,若不够三位,则在前面加0表示。
A077,而不是A77。A034,而不是A34
[ 本帖最后由 pusofalse 于 2008-8-31 21:32 编辑 ]
作者: youxi01 时间: 2008-8-31 19:13
这句话应该说清楚:按各段落文字第一列数字大小顺序排列!
如:....
作者: pusofalse 时间: 2008-8-31 19:16 标题: 回复 2楼 的帖子
谢谢指正,已经修改!
作者: terse 时间: 2008-8-31 20:02
先发个粗糙的 感觉可以精简- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1* delims=:" %%i in ('findstr /n .* "1.txt"') do (
- if "%%j"=="" (
- for /f "tokens=1* delims=#" %%a in ("!str!") do (
- set .%%a=%%a#%%b&set str=
- ))
- if defined str (set str=!str!#%%j)else set str=%%j
- )
- for /f "tokens=1* delims=#" %%a in ("!str!") do set .%%a=%%a#%%b
- for /f "tokens=2 delims==" %%i in ('set .') do (
- set str=%%i
- set "str=!str:#=&echo.!"
- call:lp
- )
- pause&exit
- :lp
- echo %str%
- echo.
复制代码
再改就这样 没突破 下面继续吧
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1* delims=:" %%i in ('findstr /n .* "1.txt"') do (
- if not "%%j"=="" (if defined str (set str=!str!#%%j)else set str=%%j)else set .!str!=ok&set str=
- )
- set .!str!=ok
- for /f "tokens=1 delims=.=" %%i in ('set .') do (
- set str=%%i
- set "str=!str:#=&echo.!"
- call:lp
- )
- pause&exit
- :lp
- echo %str%
- echo.
复制代码
[ 本帖最后由 terse 于 2008-8-31 20:39 编辑 ]
作者: pusofalse 时间: 2008-8-31 20:14 标题: 回复 4楼 的帖子
刚看到这题时我感觉有点无从下手,但那只是被这题的外表所迷惑了而已。
感觉terse前辈考虑的有点过于复杂了。
作者: terse 时间: 2008-8-31 20:45
原帖由 pusofalse 于 2008-8-31 20:14 发表
刚看到这题时我感觉有点无从下手,但那只是被这题的外表所迷惑了而已。
感觉terse前辈考虑的有点过于复杂了。
试用sort 没成功
进了胡同
[ 本帖最后由 terse 于 2008-8-31 20:49 编辑 ]
作者: pusofalse 时间: 2008-8-31 20:57
我也用过sort,也没成功,可能还是思路不畅,同是用set来排的。
似乎都考虑到了这题只是合并第一个序号到第二个序号上一行的内容为一个变量,最后set自动排序。只是方法不同~
作者: batman 时间: 2008-8-31 22:12 标题: 来凑下热闹
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1,2 delims=:" %%i in ('findstr /n .* a.txt') do (
- if not defined flag (
- set "a=%%j"&set "flag=a"
- ) else (
- if "%%j" neq "" (
- call,set "_!a!=%%_!a!%% "%%j""
- ) else (
- set "flag="
- )
- )
- )
- for /f "tokens=1,2 delims==" %%a in ('set _') do (
- echo %%a
- for %%i in (%%b) do echo %%~i
- echo.
- )
- pause>nul
复制代码
作者: batman 时间: 2008-8-31 22:13
晕,贴出来才发现和terse的如同一辙。。。
作者: huahua0919 时间: 2008-8-31 22:27
"只是合并第一个序号到第二个序号上一行的内容为一个变量"
不知道斑竹如何能够使一个回车能在set环境变量中存在?
作者: pusofalse 时间: 2008-8-31 22:56 标题: 回复 10楼 的帖子
兄所说的这种情况,恐怕是绝对不可能。或者误解我的意思了。
set var%n%=A012 Exa Explosive Weird Admission
for %%a in (!var%n%!) do echo %%a
作者: huahua0919 时间: 2008-8-31 23:03
好象段中的字也空格的吧,这样写不会将字分开了吗
作者: pusofalse 时间: 2008-8-31 23:05
是分开了,加个"闭合就可以了啊。
作者: pusofalse 时间: 2008-9-1 21:23
这题果真难倒了新手吗,期待新手解答出此题。以下,本人的解,期待更加简洁的解。- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (a.txt) do (
- set "var=%%a"
- if "!var:~1,1!" leq "9" set "str=%%a"
- call set ".!str!=%%.!str!%%"%%a" "
- )
- for /f "tokens=2 delims==" %%a in ('set .') do (
- for %%i in (%%a) do echo %%~i
- echo.
- )
- pause
复制代码
作者: flyinspace 时间: 2008-9-2 01:32
哦.看来只有另外想办法了....
利用skip吧..- @echo off
- for /f "tokens=* " %%m in ('findstr /r "^A[0-9][0-9][0-9]$" 1.txt ^| sort /+1') do (
- 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
- echo.
- )
- goto :exit
- :loop
- for /f "skip=%1 tokens=* " %%n in (1.txt) do (
- echo %%n| findstr /r "^A[0-9][0-9][0-9]$">nul
- if not errorlevel 1 goto :EOF
- echo %%n
- )
- goto :EOF
- :exit
- pause
复制代码
[ 本帖最后由 flyinspace 于 2008-9-3 14:59 编辑 ]
作者: batman 时间: 2008-9-2 20:10
原帖由 pusofalse 于 2008-9-1 21:23 发表
这题果真难倒了新手吗,期待新手解答出此题。以下,本人的解,期待更加简洁的解。@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (a.txt) do (
set "var=%%a"
if "!var:~1,1!" le ...
如就本题而言,这应该是最简洁的方案了,但如果要通用可能还是要用到set进行排序。
作者: flyinspace 时间: 2008-9-3 15:05
原帖由 batman 于 2008-9-2 20:10 发表
如就本题而言,这应该是最简洁的方案了,但如果要通用可能还是要用到set进行排序。
哦。。。那么文本的格式稍微变一下。
保持原题不变呢。
只是少了行距,和多了混乱的格式而已。
- A111
- Assure
- A12
- Cons tant
- Smail
- A012
- Exa
- Explosive
- Weird
- A12345
- Admission
- A077
- Chant
- Reli gious
- Praise
- Rhyming
- 32987
- Parsley
- A034
- Faith
- Zealous
- Absorb
- 24980
- Principle
复制代码
作者: pusofalse 时间: 2008-9-3 15:15 标题: 回复 17楼 的帖子
还是一样的解法吧,只不过要麻烦了。先找出哪些是序号,在序号前补位。
不知还有什么方法。
作者: flyinspace 时间: 2008-9-3 15:28
原帖由 pusofalse 于 2008-9-3 15:15 发表
还是一样的解法吧,只不过要麻烦了。先找出哪些是序号,在序号前补位。
不知还有什么方法。
只是看到你解决问题的方案比较儿戏。
不过也够简洁。
所以故意难为你一下。
作者: keen 时间: 2009-5-14 23:37
用了N多的FOR:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in (a.txt) do (
- set str=%%i
- if "!str:~0,1!"=="A" (
- set var=!str:~-3!
- if !var! gtr 0 if !var! lss 999 set /a n+=1
- )
- call,set ".!n!=%%.!n!%%"%%i" "
- )
- for /f "tokens=2 delims==" %%i in ('set .') do (
- for /f "tokens=1" %%a in ("%%i") do (
- set hh=%%a&set num=!hh:~2,3!&set _!num!=%%i
- ))
- for /f "tokens=2 delims==" %%i in ('set _') do (
- for %%b in (%%i) do echo %%~b
- echo\
- )
- pause
复制代码
[ 本帖最后由 keen 于 2009-5-15 00:01 编辑 ]
作者: weichenxiehou 时间: 2011-1-1 19:59
- @echo off&setlocal enabledelayedexpansion
- for /f "usebackq" %%i in (`findstr "^A[0-9]*$" a.txt^|sort`) do (set /a num+=1&set "_!num!=%%i")
- for /l %%a in (1 1 %num%) do (
- call set "var=%%_%%a%%"
- for /f "delims=" %%j in (a.txt) do (
- if "%%j"=="!var!" (set flag=yes&set /a n=0) else (
- echo %%j|findstr "^A[0-9]*$">nul&&(set flag=&set /a n+=1&(if !n! equ 1 echo.))
- )
- if defined flag echo %%j
- )
- )
复制代码
[ 本帖最后由 weichenxiehou 于 2011-1-1 20:02 编辑 ]
作者: lengmoke 时间: 2021-9-23 16:09
本帖最后由 lengmoke 于 2021-9-23 17:06 编辑
- @echo off & setlocal EnableDelayedExpansion
- md temp
- for /f "tokens=1* delims=:" %%i in ('findstr /n .* "a.txt"') do (
- if not "%%j"=="" ( set "str=%%j" & set "strs=!strs! !str: =+!" ) else ( md "temp\!strs!" & set "strs=" )
- )
- md "temp\!strs!"
- for /f "delims=" %%i in (' dir /b/on %cd%\temp ') do (
- for %%j in (%%i) do ( set "str=%%j" & echo !str:+= !)
- echo.
- )
- rd /q/s temp
复制代码
作者: qixiaobin0715 时间: 2021-9-24 12:14
试了试,发现还是和前辈们思路基本一致,就不好意思发出来了。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |