我想制作脚本,在文档example.txt中按长度排序所有行(某些行有空格)。最长的行将是第一行,最短的行将在文档的末尾。脚本可以重写原始文档。谢谢: - )
答案 0 :(得分:3)
通过在临时文件夹中将每一行写为自己的文件,可以非常轻松快捷地完成此任务。然后使用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个字符。这种限制是任何纯本地批处理解决方案所固有的。
答案 1 :(得分:3)
此批处理文件使用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%"
答案 2 :(得分:2)
我认为这是最简单,最快捷的方式:
@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
此解决方案从文件中删除空行和感叹号。如果需要,这两个限制都可以修复。
答案 3 :(得分:0)
您需要strLen function from this page。另外,here is a download link下载sortn.bat,它将为您提供入门提示。此外,您需要熟悉基本的比较功能:
public int compare(String o1, String o2) {
if (o1.length()!=o2.length()) {
return o1.length()-o2.length();
}
return o1.compareTo(o2);
}
祝你好运。