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

[ 新手练习题 10 ] 批处理实现文本行序重排

[ 新手练习题 10 ] 文本行序重排
假设原文本:
  1. A B
  2. B D
  3. X C
  4. D M
复制代码
显示示例:
  1. D M
  2. B D
  3. A B
  4. X C
复制代码
注意:以上只是一个范例。

若某行甲的首字母与另一行乙的尾字母相同,则行甲要排在行乙前面。

未进行重排的行位置任意。
假定:每一纵列不会出现重复字母,同行字母也不会相同。
也不会出现如 “A B”,“B A” 这样会让排序进入死循环的行。

目的:综合运用,学习字符串对比方法。

要求:不区分大小写;
   方法不限。

评分:代码可读性 1 分;
   首个新方法 8 分,第二个 6 分,依次类推,最少 2 分;
   一人可多种方法,新方法追加 4 分,已经出现过的方法追加 1 分。

[ 本帖最后由 wxcute 于 2009-9-29 17:20 编辑 ]
批处理之家论坛官方 QQ 群 :【当前人数/人数上限】【2009-07-08】
群①:43011867(181/200);群②:(暂缺数据);群③:66165582(120/200)。

sort不能用自定义规则排序……
新手上路!

TOP

这样对吗
zhouyongjun 发表于 2009-9-30 10:56

自己对大神代码的理解,希望能对跟我一样的新人有帮助
@echo off&setlocal enabledelayedexpansion
for /f "tokens=1-2" %%a in (a.txt) do (
        set #%%a=%%a %%b&set $%%b=%%a %%b&set _%%b=%%a&set "@%%a=%%a %%b"
        :: 该右侧字母是否存在对应的左侧字母,如果有 则当前行首次不展示,跟着重排
        if defined #%%b set "@%%a="
        :: 该左侧字母是否存在对应的右侧字母,如果有,找出右侧字母对应的行,则该行重排
        if defined $%%a set "@!_%%a!="
)
:: @字符开头的变量都是不需要重排的;set @ 展示 @开头的变量
for /f "tokens=2-3 delims== " %%a in ('set @') do (
        echo %%a %%b&set str=%%a&call :px
)
pause
:px
if defined $!str! (
        :: 展示重排的数据
        echo !$%str%!&set str=!$%str%!&set str=!str:~,1!&goto px
)

TOP

回复 19# 高飞高飞1111


    set                    #显示目前所有可用的变量,包括系统变量和自定义的变量
set p                  #显示所有以p开头的变量,要是一个也没有就设errorlevel=1

TOP

回复 15# zhouyongjun


    for /f "tokens=2-3 delims== " %%a in ('set @') do  
我想问一下,set @是什么意思,怎么理解呢

TOP

mark
----------------------------------
试着写了一下,然后又看了一下楼下的代码,果然、差的太多了,解析进行到一半就卡住了,完全不知道该怎么去想,特别是那个set 变量的,看的云里雾里,慢慢来吧。
---------------------------------
踏实一些点.不要着急.你想要的时间都会给你.2

TOP

本帖最后由 keiamy 于 2014-1-26 17:40 编辑

自己不怎么会做,都是参照楼上各高手的
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2" %%i in (a.txt) do (
  3. set "$%%i=%%i#%%j"
  4. set "@%%j=%%i#%%j"
  5. if defined @%%i (call set "str=%%str:!@%%i!=!$%%i! !@%%i!%%"
  6. ) else (
  7. if defined $%%j (call set "str=%%str:!$%%j!=!$%%j! !@%%j!%%"
  8. ) else (
  9. set "str=!str! !$%%i!")))
  10. for %%i in (%str%) do (set "var=%%i"&echo !var:#= !)
  11. pause
复制代码
我是NO.1 呀﹗不過.......@echo是在菜鳥比賽中....>.<

TOP

re 版主

确实我从论坛复制下来测试没有问题,所以。。。

原来是有时候复制和粘贴代码时会丢掉后面的空格。

不好意思,看来我要改掉不加双引号的习惯才行

TOP

这样对吗
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1-2" %%a in (a.txt) do (
  3. set #%%a=%%a %%b&set $%%b=%%a %%b&set _%%b=%%a&set "@%%a=%%a %%b"
  4. if defined #%%b set "@%%a="
  5. if defined $%%a set "@!_%%a!="
  6. )
  7. for /f "tokens=2-3 delims== " %%a in ('set @') do (
  8. echo %%a %%b&set str=%%a&call :px
  9. )
  10. pause&exit
  11. :px
  12. if defined $!str! (
  13. echo !$%str%!&set str=!$%str%!&set str=!str:~,1!&goto px
  14. )
复制代码
2

评分人数

TOP

加了,可还是一样。
两位技术组成员写代码都没加暂停,我一样测试。所以这点能力是不用怀疑我的。
另外我猜可能是我机子的问题,由于个人原因,没办法换机器测试,只好拜托有条件的兄弟朋友帮忙进行测试了。
测试文本
d a
c b
a c
f q
注释掉 @echo off 后
最后一行测试显示为:echo;!tdcaf!
=================================
不好意思,可能是电脑上记事本程序有问题,一行中最后一个字符若是空格,复制到记事本中会被自动忽略掉。
所以复制代码时少了两个空格,又因为代码中设置变量的行没有用引号闭合,所以没有检查出来。
代码中四、五两行加上空格后测试正确。

[ 本帖最后由 wxcute 于 2009-9-30 09:47 编辑 ]
批处理之家论坛官方 QQ 群 :【当前人数/人数上限】【2009-07-08】
群①:43011867(181/200);群②:(暂缺数据);群③:66165582(120/200)。

TOP

re 版主

我自己从论坛复制下来的,经测试也正常呀,
可能是太快了,一闪而过吧
在后面加个暂停看看

TOP

回复 11楼 的帖子

没有任何输出哦?
其中a.txt文件存在,内容正常。
批处理之家论坛官方 QQ 群 :【当前人数/人数上限】【2009-07-08】
群①:43011867(181/200);群②:(暂缺数据);群③:66165582(120/200)。

TOP

这个可以了,支持字母以外的字符

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=*" %%a in (a.txt) do (
  3.         set str=%%a
  4.         set t=!t!!str:~,1!
  5.         set w=!w!!str:~-1!
  6.         set t!str:~,1!=%%a
  7. )
  8. :lp
  9. (
  10. for %%b in (!t!) do (
  11.         for %%c in ("!t%%~b:~-1!") do (
  12.                 set str=!w:*%%~b=!
  13.                 if !str! neq !w! (
  14.                         if "!str:%%~c=!" neq "!str!" (
  15.                                 set w=%%~c !w: %%~c=!
  16.                                 set t=%%b !t: %%b=!
  17.                         )
  18.                 )
  19.         )
  20. )
  21. if "%w%" neq "!w!" goto :lp)
  22. for %%b in (!t!) do echo;!t%%~b!
复制代码
1

评分人数

    • wxcute: 补上加分。现测试正常,之前是我操作出错。PB + 10

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. set n=-1
  3. for /f "tokens=*" %%a in (a.txt) do (
  4. set str=%%a
  5. set t=!t!!str:~,1!
  6. set w=!w!!str:~-1!
  7. set t!str:~,1!=%%a
  8. set w!str:~-1!=%%a
  9. set/a n+=1
  10. )
  11. for /l %%a in (0,1,!n!) do for %%b in ("!t:~%%a,1!") do (
  12. if "!w:%%~b=!" neq "!w!" for %%c in ("!t%%~b:~-1!") do set w=%%~c!w:%%~c=!
  13. )
  14. for /l %%a in (0,1,!n!) do for %%b in ("!w:~%%a,1!") do echo;!w%%~b!
复制代码
1

评分人数

    • wxcute: 测试如下样本不正确 d a c b a c f q ...PB + 3

TOP

修改完毕,请大大们提意见~
  1. C C
  2. D D
复制代码

这种情况请无视

[ 本帖最后由 Seter 于 2009-9-29 16:54 编辑 ]
1

评分人数

    • wxcute: 谢谢指正,题目已更新(细节)PB + 1

TOP

返回列表