批处理之家's Archiver

pusofalse 发表于 2008-8-31 14:51

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

前些天在CN-DOS翻老帖,看到如此的一个题目,又加深了一点难度,有兴趣的来做下。
加分规则:
1.思路独特 5分
2.代码高效、通用 4分
3.技巧高超 4分
4.代码简洁 2分
5.完美代码 15分
题目如下:
a.txt内容:[code]A111
Assure
Cons tant
Smail

A012
Exa
Explosive
Weird
Admission

A077
Chant
Reli gious
Praise
Rhyming
Parsley

A034
Faith
Zealous
Absorb
Principle[/code]按照段落序号从小到大顺序排列,如下:[code]A012
Exa
Explosive
Weird
Admission

A034
Faith
Zealous
Absorb
Principle

A077
Chant
Reli gious
Praise
Rhyming
Parsley

A111
Assure
Cons tant
Smail[/code]每段的单词个数未知,在单词随机处有空格。
段落序号A之后的数字总是3位,若不够三位,则在前面加0表示。
A077,而不是A77。A034,而不是A34

[[i] 本帖最后由 pusofalse 于 2008-8-31 21:32 编辑 [/i]]

youxi01 发表于 2008-8-31 19:13

[quote]
从小到大排列
[/quote]

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

pusofalse 发表于 2008-8-31 19:16

回复 2楼 的帖子

谢谢指正,已经修改!

terse 发表于 2008-8-31 20:02

先发个粗糙的 感觉可以精简[code]@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.[/code]
再改就这样  没突破  下面继续吧
[code]@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.[/code]

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

pusofalse 发表于 2008-8-31 20:14

回复 4楼 的帖子

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

terse 发表于 2008-8-31 20:45

[quote]原帖由 [i]pusofalse[/i] 于 2008-8-31 20:14 发表 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=9231&ptid=1693][img]http://bbs.bathome.net/images/common/back.gif[/img][/url]
刚看到这题时我感觉有点无从下手,但那只是被这题的外表所迷惑了而已。
感觉terse前辈考虑的有点过于复杂了。 [/quote]
试用sort  没成功
进了胡同

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

pusofalse 发表于 2008-8-31 20:57

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

batman 发表于 2008-8-31 22:12

来凑下热闹

[code]@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   [/code]

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

这题果真难倒了新手吗,期待新手解答出此题。以下,本人的解,期待更加简洁的解。[code]@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[/code]

flyinspace 发表于 2008-9-2 01:32

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

利用skip吧..[code]@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[/code]

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

batman 发表于 2008-9-2 20:10

[quote]原帖由 [i]pusofalse[/i] 于 2008-9-1 21:23 发表 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=9329&ptid=1693][img]http://www.bathome.net/images/common/back.gif[/img][/url]
这题果真难倒了新手吗,期待新手解答出此题。以下,本人的解,期待更加简洁的解。@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (a.txt) do (
     set "var=%%a"
     if "!var:~1,1!" le ... [/quote]
如就本题而言,这应该是最简洁的方案了,但如果要通用可能还是要用到set进行排序。

flyinspace 发表于 2008-9-3 15:05

[quote]原帖由 [i]batman[/i] 于 2008-9-2 20:10 发表 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=9449&ptid=1693][img]http://www.bathome.net/images/common/back.gif[/img][/url]

如就本题而言,这应该是最简洁的方案了,但如果要通用可能还是要用到set进行排序。 [/quote]

哦。。。那么文本的格式稍微变一下。

保持原题不变呢。

只是少了行距,和多了混乱的格式而已。
[code]
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
[/code]

pusofalse 发表于 2008-9-3 15:15

回复 17楼 的帖子

还是一样的解法吧,只不过要麻烦了。先找出哪些是序号,在序号前补位。
不知还有什么方法。

flyinspace 发表于 2008-9-3 15:28

[quote]原帖由 [i]pusofalse[/i] 于 2008-9-3 15:15 发表 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=9493&ptid=1693][img]http://www.bathome.net/images/common/back.gif[/img][/url]
还是一样的解法吧,只不过要麻烦了。先找出哪些是序号,在序号前补位。
不知还有什么方法。 [/quote]

只是看到你解决问题的方案比较儿戏。
不过也够简洁。

所以故意难为你一下。

keen 发表于 2009-5-14 23:37

用了N多的FOR:[code]@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[/code]

[[i] 本帖最后由 keen 于 2009-5-15 00:01 编辑 [/i]]

weichenxiehou 发表于 2011-1-1 19:59

[code]@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               
        )
)[/code]

[[i] 本帖最后由 weichenxiehou 于 2011-1-1 20:02 编辑 [/i]]

lengmoke 发表于 2021-9-23 16:09

[i=s] 本帖最后由 lengmoke 于 2021-9-23 17:06 编辑 [/i]

[code]
@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
[/code]

qixiaobin0715 发表于 2021-9-24 12:14

试了试,发现还是和前辈们思路基本一致,就不好意思发出来了。

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.