【发布时间】:2021-05-21 10:58:58
【问题描述】:
我正在做一个学校项目,我需要按用户使用批处理脚本选择的列对文本文件进行排序。
文件如下所示
ID Name Weight Length With Height
052 Chair 1200 100 30 2
077 Bookshelf 5000 120 30 80
096 Cabinet 15000 80 40 85
146 Cupboard 9000 80 60 200
149 Desk 3650 180 100 5
163 Mirror 25800 120 60 70
182 Table 1600 60 60 70
我尝试从这个答案Batch sort by column in file复制解决方案
并修改为6列,代码如下:
setlocal DisableDelayedExpansion
(
for /F "tokens=1-6 delims= " %%A in (%file%) DO (
set "par1=%%A"
set "par2=%%B"
set "par3=%%C"
set "par4=%%D"
set "par5=%%E"
set "par6=%%F"
setlocal EnableDelayedExpansion
echo(!par3! !par1! !par2! !par3! !par4! !par5! !par6!
endlocal
)
) > data.txt.tmp
for /F "usebackq tokens=1,* delims= " %%A in (`sort data.txt.tmp`) DO (
echo(%%B
)
所以我遇到的问题是我希望带有 ID 名称等的第一行保持不变。第二件事是这段代码在按 ID 和名称排序时有效,但是当我得到权重时,它不会正确排序,我得到如下输出:
052 Chair 1200 100 30 2
096 Cabinet 15000 80 40 85
182 Table 1600 60 60 70
163 Mirror 25800 120 60 70
149 Desk 3650 180 100 5
077 Bookshelf 5000 120 30 80
146 Cupboard 9000 80 60 200
ID Name Weight Length With Height
它似乎只是按第一位和第二位数字排序,导致 15000 小于 1600
我怎样才能以最好的方式解决这些问题?
【问题讨论】:
-
令人惊讶的是,您的数据与昨天刚刚询问的 question 几乎完全相同。
-
两个问题: 1. 您必须使用
skip=1forfor /F选项将标题排除在排序之外;要将其用于输出,请使用< %file% (set "HL=" & set /P HL="")并稍后执行echo(%HL%。 2.sort按字母排序,但您需要的是字母数字排序;要实现这一点,您必须暂时用零填充数字,以使它们包含相同数量的数字,然后您可以按字母顺序等于字母数字顺序。 N. B.: 不需要par#变量,也不需要延迟扩展;只需使用:echo(%%C %%A %%B %%C %%D %%E %%F... -
@aschipfl 感谢您的实际帮助!
标签: file sorting batch-file