Board logo

标题: [文本处理] 批处理怎样按照字符串长度对文本进行排序? [打印本页]

作者: BatCoder    时间: 2010-9-7 21:20     标题: 批处理怎样按照字符串长度对文本进行排序?

原文举例:
aaa
bbbb
cc
ddddd

希望得到的结果:
cc
aaa
bbbb
ddddd
作者: TX_kakashi    时间: 2010-9-9 08:56

文本文件的内容大概有多少行?
作者: hfg1977    时间: 2010-9-9 11:51

纯P
  1. @echo off
  2. setlocal enabledelayedexpansion&cls
  3. echo. · 按照字符串长度对文本进行排序
  4. echo.
  5. :start ============================================================
  6. if "%~1"=="" (set fname=1.txt) else (if not exist "%~1.\" (if exist "%~1" (set "fname=%~1") else (echo 文件不存在&goto end)) else (echo 不想处理文件夹&goto end))
  7. cd.>temp1.txt
  8. for /f "tokens=* usebackq delims=" %%a in ("%fname%") do (
  9. call:getStrLen "%%a"
  10. set "strlen=0000!strlen!"&set "strlen=!strlen:~-4!
  11. echo.!strlen!:%%a>>temp1.txt
  12. )
  13. cd.>"%fname%"
  14. for /f "tokens=1,* delims=:" %%a in ('sort temp1.txt') do (echo %%b>>"%fname%")
  15. :end ==============================================================
  16. for /l %%a in (5,-1,1) do (set/p =退出... ^(%%a^)<nul&ping/n 2 127.1>nul)
  17. del temp1.txt
  18. exit /b
  19. ::=======================获得字符串长度==============================
  20. ::返回值在中%strlen%
  21. :getStrLen mystr
  22. set "mystr=%~1"&set "strlen=0"
  23. if not defined mystr goto :eof
  24. for /l %%i in (0,1,8191) do (set strlen=%%i&if "!mystr:~%%i,1!"=="" (goto :eof))
  25. goto :eof
  26. ::==============END======获得字符串长度========== by hf-g ===========
复制代码

[ 本帖最后由 hfg1977 于 2010-9-9 11:53 编辑 ]
作者: hfg1977    时间: 2010-9-9 11:55

set/p =退出... ^(%%a^) 退格键退格键<nul
这里带有 退格键12个的呦 论坛没显示出来
作者: sgaizxt001    时间: 2010-9-9 21:21

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in (03.txt) do (
  4.   set str=00000000000000000000000000%%a
  5.   set _!str:~-20!=0
  6. )
  7. for /f "tokens=2 delims=0=" %%a in ('set _') do echo %%a
  8. pause
复制代码
对set str=00000000000000000000000000%%a和set _!str:~-20!=0可以根据自己的需求自己定义一下长度
作者: zqz0012005    时间: 2010-9-10 21:00

为避免以0开头的行被误处理及兼容特殊字符,来段js
  1. fso = new ActiveXObject('Scripting.FileSystemObject');
  2. s = fso.OpenTextFile('01.txt').ReadAll().replace(/\r/g,''); //'\r'非常恶心!
  3. if (s.slice(-1)=='\n') s=s.slice(0,-1); //需要稍作修整,为下面replace(/^/gm,head)
  4. head=new Array(1000).join('.')+':'; //head为1000个.加一个:
  5. s=s.replace(/^/gm,head).match(/.{1000}$/gm).sort().join('\r\n').replace(/^\.+:/gm,'');
  6. fso.OpenTextFile('02.txt',2,true).Write(s);
复制代码

作者: zqz0012005    时间: 2010-9-10 22:21

再来个js
fso = new ActiveXObject('Scripting.FileSystemObject');
s = fso.OpenTextFile('01.txt').ReadAll().replace(/\r/g,'');
if (s.slice(-1)=='\n') s=s.slice(0,-1);
s=s.replace(/^.*$/gm, function(ss){return ss.length+'-'+ss});
s=s.split('\n').sort(
  
function(a,b){return (a.replace(/-.*$/,'') - b.replace(/-.*$/,''));}
)
s=s.join('\r\n').replace(/^\d+-/gm,'');
fso.OpenTextFile('02.txt',2,true).Write(s);

作者: cm535    时间: 2011-7-25 11:31

试了一下3楼的代码,针对小文件使用时很好,但用于大文件就非常慢了,我的3M的文件运行了半个小时还没有搞定!能针对大文件做一个代码吗?谢谢,谢谢!感谢各位高手!
作者: tmplinshi    时间: 2011-7-25 12:51

  1. gawk "{print length(), $0}" a.txt | sort -n | csed -n "/^[^0]/ s/^[0-9]\+ //p" >b.txt
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2