标题: [ 新手练习题 10 ] 批处理实现文本行序重排 [打印本页]
作者: wxcute 时间: 2009-9-24 20:31 标题: [ 新手练习题 10 ] 批处理实现文本行序重排
[ 新手练习题 10 ] 文本行序重排
假设原文本:复制代码
显示示例:复制代码
注意:以上只是一个范例。
若某行甲的首字母与另一行乙的尾字母相同,则行甲要排在行乙前面。
未进行重排的行位置任意。
假定:每一纵列不会出现重复字母,同行字母也不会相同。
也不会出现如 “A B”,“B A” 这样会让排序进入死循环的行。
目的:综合运用,学习字符串对比方法。
要求:不区分大小写;
方法不限。
评分:代码可读性 1 分;
首个新方法 8 分,第二个 6 分,依次类推,最少 2 分;
一人可多种方法,新方法追加 4 分,已经出现过的方法追加 1 分。
[ 本帖最后由 wxcute 于 2009-9-29 17:20 编辑 ]
作者: kjliuo 时间: 2009-9-25 19:37 标题: 新手,第一次回贴!
- @echo off
- set a=A B
- set b=B D
- set c=X C
- set d=D M
- echo %d%&echo %b%&echo %a%&echo %c%
- pause>nul
复制代码
作者: wxcute 时间: 2009-9-25 19:41 标题: 回复 2 楼 kjliuo 的帖子
只是示例文本,值并不是固定的。
可能你没看清题意。
作者: mm546863903 时间: 2009-9-28 15:10
算是出来了,就是很麻烦,没有用循环,楼主看看对不对
@echo off
set /p x=请输入第一个字符串:
set /p y=请输入第二个字符串:
set /p m=请输入第三个字符串:
set /p n=请输入第四个字符串:
if "%x%" lss "%y%" set y=%x%&set x=%y%
if "%x%" lss "%m%" set m=%x%&set x=%m%
if "%x%" lss "%n%" set n=%x%&set x=%n%
if "%y%" lss "%m%" set m=%y%&set y=%m%
if "%y%" lss "%n%" set n=%y%&set y=%n%
if "%m%" lss "%n%" set n=%m%&set m=%n%
echo %x%
echo %y%
echo %m%
echo %n%
pause
作者: Seter 时间: 2009-9-28 15:38
原帖由 mm546863903 于 2009-9-28 15:10 发表
算是出来了,就是很麻烦,没有用循环,楼主看看对不对
@echo off
set /p x=请输入第一个字符串:
set /p y=请输入第二个字符串:
set /p m=请输入第三个字符串:
set /p n=请输入第四个字符串:
if "%x%" lss ...
1.最好从文本读取
2.不一定只有4个
这问题一点也不新手...我昨天做了个效率还行不过太麻烦,没好意思发结果删掉了...
作者: Seter 时间: 2009-9-29 16:02
复制代码
这个应该怎么排?
作者: wxcute 时间: 2009-9-29 16:20 标题: 回复 6楼 Seter 的帖子
其中一种排法复制代码
O K 这两个字母只出现一次,位置可以任意;
D E、M D 这两组与前面 B C、A B 这两组无关联,因此也可以放在上面,或是穿插其中。
作者: Seter 时间: 2009-9-29 16:34
C语言思路,效率中等偏低,我学C的,大大别骂人~- @echo off&setlocal enabledelayedexpansion
- set i=1
- for /f "delims=" %%i in (t.txt) do set t=%%i&set t!i!=%%i&set f!t:~,1!=!i!
- &set e!t:~-1!=!i!&set/ai+=1
- for %%i in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do if
- defined "!f%%i!" if defined "!e%%i!" set l!f%%i!=!e%%i!&set p!e%%i!=!f%%i!
- :a
- for /l %%i in (1,1,%i%) do if "!l%%i!" neq "" set k=%%i&goto n
- for /l %%i in (1,1,%i%) do if "!t%%i!" neq "" echo !t%%i!
- pause&exit
- :n
- if defined "!p%k%!" set k=!p%k%!&goto n
- :k
- if "%k%"=="" goto a
- set t=%k%&echo !t%k%!&set t%k%=&set k=!l%k%!&set l%t%=&goto k
复制代码
[ 本帖最后由 Seter 于 2009-9-29 17:51 编辑 ]
作者: Seter 时间: 2009-9-29 16:37
修改完毕,请大大们提意见~
复制代码
这种情况请无视
[ 本帖最后由 Seter 于 2009-9-29 16:54 编辑 ]
作者: netbenton 时间: 2009-9-29 19:28
- @echo off&setlocal enabledelayedexpansion
- set n=-1
- for /f "tokens=*" %%a in (a.txt) do (
- set str=%%a
- set t=!t!!str:~,1!
- set w=!w!!str:~-1!
- set t!str:~,1!=%%a
- set w!str:~-1!=%%a
- set/a n+=1
- )
- for /l %%a in (0,1,!n!) do for %%b in ("!t:~%%a,1!") do (
- if "!w:%%~b=!" neq "!w!" for %%c in ("!t%%~b:~-1!") do set w=%%~c!w:%%~c=!
- )
-
- for /l %%a in (0,1,!n!) do for %%b in ("!w:~%%a,1!") do echo;!w%%~b!
复制代码
作者: netbenton 时间: 2009-9-29 20:51
这个可以了,支持字母以外的字符
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=*" %%a in (a.txt) do (
- set str=%%a
- set t=!t!!str:~,1!
- set w=!w!!str:~-1!
- set t!str:~,1!=%%a
- )
-
- :lp
- (
- for %%b in (!t!) do (
- for %%c in ("!t%%~b:~-1!") do (
- set str=!w:*%%~b=!
- if !str! neq !w! (
- if "!str:%%~c=!" neq "!str!" (
- set w=%%~c !w: %%~c=!
- set t=%%b !t: %%b=!
- )
- )
- )
- )
- if "%w%" neq "!w!" goto :lp)
-
- for %%b in (!t!) do echo;!t%%~b!
复制代码
作者: wxcute 时间: 2009-9-29 21:06 标题: 回复 11楼 的帖子
没有任何输出哦?
其中a.txt文件存在,内容正常。
作者: netbenton 时间: 2009-9-29 23:32 标题: re 版主
我自己从论坛复制下来的,经测试也正常呀,
可能是太快了,一闪而过吧
在后面加个暂停看看
作者: wxcute 时间: 2009-9-30 08:20
加了,可还是一样。
两位技术组成员写代码都没加暂停,我一样测试。所以这点能力是不用怀疑我的。
另外我猜可能是我机子的问题,由于个人原因,没办法换机器测试,只好拜托有条件的兄弟朋友帮忙进行测试了。
测试文本
d a
c b
a c
f q
注释掉 @echo off 后
最后一行测试显示为:echo;!tdcaf!
=================================
不好意思,可能是电脑上记事本程序有问题,一行中最后一个字符若是空格,复制到记事本中会被自动忽略掉。
所以复制代码时少了两个空格,又因为代码中设置变量的行没有用引号闭合,所以没有检查出来。
代码中四、五两行加上空格后测试正确。
[ 本帖最后由 wxcute 于 2009-9-30 09:47 编辑 ]
作者: 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!="
- )
- for /f "tokens=2-3 delims== " %%a in ('set @') do (
- echo %%a %%b&set str=%%a&call :px
- )
- pause&exit
- :px
- if defined $!str! (
- echo !$%str%!&set str=!$%str%!&set str=!str:~,1!&goto px
- )
复制代码
作者: netbenton 时间: 2009-9-30 13:10 标题: re 版主
确实我从论坛复制下来测试没有问题,所以。。。
原来是有时候复制和粘贴代码时会丢掉后面的空格。
不好意思,看来我要改掉不加双引号的习惯才行
作者: keiamy 时间: 2014-1-23 18:23
本帖最后由 keiamy 于 2014-1-26 17:40 编辑
自己不怎么会做,都是参照楼上各高手的- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1,2" %%i in (a.txt) do (
- set "$%%i=%%i#%%j"
- set "@%%j=%%i#%%j"
- if defined @%%i (call set "str=%%str:!@%%i!=!$%%i! !@%%i!%%"
- ) else (
- if defined $%%j (call set "str=%%str:!$%%j!=!$%%j! !@%%j!%%"
- ) else (
- set "str=!str! !$%%i!")))
- for %%i in (%str%) do (set "var=%%i"&echo !var:#= !)
- pause
复制代码
作者: 慕夜蓝化 时间: 2014-12-31 11:46
mark
----------------------------------
试着写了一下,然后又看了一下楼下的代码,果然、差的太多了,解析进行到一半就卡住了,完全不知道该怎么去想,特别是那个set 变量的,看的云里雾里,慢慢来吧。
---------------------------------
作者: 高飞高飞1111 时间: 2022-3-16 20:48
回复 15# zhouyongjun
for /f "tokens=2-3 delims== " %%a in ('set @') do
我想问一下,set @是什么意思,怎么理解呢
作者: 772074834 时间: 2023-5-5 16:25
回复 19# 高飞高飞1111
set #显示目前所有可用的变量,包括系统变量和自定义的变量
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
作者: 772074834 时间: 2023-5-5 17:39
这样对吗
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
)
作者: chenyucheng 时间: 2023-8-1 13:06
sort不能用自定义规则排序……
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |