文本行序重排
假设原文本:
- A B
- B D
- X C
- D M
显示示例:
- D M
- B D
- A B
- X C
注意:以上只是一个范例。
若某行甲的首字母与另一行乙的尾字母相同,则行甲要排在行乙前面。
未进行重排的行位置任意。
假定:每一纵列不会出现重复字母,同行字母也不会相同。
也不会出现如 “A B”,“B A” 这样会让排序进入死循环的行。
方法1
@echo off&setlocal enabledelayedexpansion
chcp 65001
@echo off&setlocal enabledelayedexpansion
for /f "tokens=*" %%a in (10-批处理实现文本行序重排.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!
pause
方法2
@echo off&setlocal enabledelayedexpansion
for /f "tokens=1-2" %%a in (10-批处理实现文本行序重排.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
)