Sorting 如何使用批处理脚本按长度对行进行排序?

Sorting 如何使用批处理脚本按长度对行进行排序?,sorting,batch-file,line,Sorting,Batch File,Line,我想制作脚本,它在documentexample.txt中按长度对所有行进行排序(有些行有空格)。最长的一行是第一行,最短的一行是在文档的末尾。脚本可以重写原始文档。谢谢:-)您需要这个。另外,下载sortn.bat,它将为您提供入门提示。此外,您还需要熟悉基本的比较功能: public int compare(String o1, String o2) { if (o1.length()!=o2.length()) { retu

我想制作脚本,它在documentexample.txt中按长度对所有行进行排序(有些行有空格)。最长的一行是第一行,最短的一行是在文档的末尾。脚本可以重写原始文档。谢谢:-)

您需要这个。另外,下载sortn.bat,它将为您提供入门提示。此外,您还需要熟悉基本的比较功能:

public int compare(String o1, String o2) {             
        if (o1.length()!=o2.length()) {
            return o1.length()-o2.length();
        }
        return o1.compareTo(o2);
    }

祝你好运。

通过将每一行作为自己的文件写入一个临时文件夹中来完成这项任务是非常简单和快速的。然后使用DIR/B/O-S按大小对文件(行)排序,使用FOR/F捕获结果,然后使用TYPE打印每个文件(行)

@echo off
setlocal disableDelayedExpansion

set "file=example.txt"
set "tempLoc=sortLinesTemp"

md "%tempLoc%"
set "cnt=0"
for /f usebackq^ delims^=^ eol^= %%A in ("%file%") do (
  set /a cnt+=1
  set "ln=%%A"
  setlocal enableDelayedExpansion
  echo(!ln!>"%tempLoc%\f!cnt!"
  endlocal
)
(for /f %%F in ('dir /b /o-s "%tempLoc%"') do type "%tempLoc%\%%F")>"%file%.new"
move /y "%file%.new" "%file%" >nul
rd /s /q "%tempLoc%"
type "%file%"
此解决方案将剥离空行。空行可以保留多一点代码


此外,行长度限制为略小于8191个字符。此限制是任何纯本机批处理解决方案固有的。

此批处理文件使用VBS脚本帮助获取行长度,并进行排序,然后将
input.txt
文件重写为
input.new.txt

使用如下批处理:
sortline.bat“filename.txt”

行首的
|
字符将消失

@echo off
set "file=%temp%\sortline.vbs"
(
 echo. Const ForReading = 1, ForWriting = 2
 echo. infile = "%~1"
 echo. Set fso = CreateObject("Scripting.FileSystemObject"^)
 echo. Set f1 = fso.OpenTextFile(infile, ForReading^)
 echo. Do While not f1.AtEndOfStream
 echo. f = f1.readline
 echo. Wscript.echo right(10000+len(f^),4^) ^& "|" ^& f
 echo. loop
 echo. f1.close
)>"%file%"
(for /f "tokens=1,* delims=|" %%a in (' cscript //nologo "%file%" ^|sort /r ') do echo(%%b)>"%~n1.new.txt"
del "%file%"

我认为这是最简单、最快的方法:

@echo off
setlocal EnableDelayedExpansion

set /A seqNum=10000, accumLen=0
set "lastLine="
for /F "tokens=1* delims=:" %%a in ('findstr /O "^" example.txt') do (
   if not defined lastLine (
      set "lastLine=%%b"
   ) else (
      set /A "seqNum+=1, thisLen=10000-(%%a-accumLen), accumLen=%%a"
      set "line[!thisLen!!seqNum:~-4!]=!lastLine!"
      set "lastLine=%%b"
   )
)
for %%a in (example.txt) do (
   set /A "seqNum+=1, thisLen=10000-(%%~Za-accumLen)"
   set "line[!thisLen!!seqNum:~-4!]=!lastLine!"
)
(for /F "tokens=1* delims==" %%a in ('set line[') do echo %%b) > sorted.txt

此解决方案将从文件中删除空行和感叹号。如果需要,这两个限制都可以修复。

小错误-您应该使用
echo(%b
以防止空行或只包含空格的行。另一个限制-行长度限制为~8191个字符。谢谢,这个脚本可以工作。在我的文档中不是空行,所以它是可以的。@dbenham:
seqNum
从10001开始计数,
!seqNum:~-4!
是我生成数字4 di的标准方法Git长,带左零,用于保留长度相同的行。例如,两条长度为23的行:
line[99770001]=…
line[99770002]=…
Oops-抱歉,我错过了表达式中的减号,行损坏使我认为输出中缺少行。但是,没有必要将seqNum填充为恒定宽度。需要该值来区分相同长度的行。但是等长行的排序顺序并不重要。有two其他限制。1)引导:从每条线中剥离字符-这可以是固定的。2)线长度限制为~8175个字符。这是无法修复的。@dbenham:如果输入文件很大,我认为这种方法应该比您的方法每行创建一个文件快得多……我有点惊讶地发现事实正好相反。对于一个包含3183行的小文件,您的代码以5秒的速度略微快于我的7.3秒。但对于包含13155行的较大文件,我的代码耗时27秒,而您的代码耗时77秒。按照今天的标准,我的硬盘相当慢。它当然不是固态硬盘。