标题: [文本处理] 批处理怎样按照字符串长度对文本进行排序? [打印本页]
作者: 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
- @echo off
- setlocal enabledelayedexpansion&cls
- echo. · 按照字符串长度对文本进行排序
- echo.
- :start ============================================================
- 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))
- cd.>temp1.txt
- for /f "tokens=* usebackq delims=" %%a in ("%fname%") do (
- call:getStrLen "%%a"
- set "strlen=0000!strlen!"&set "strlen=!strlen:~-4!
- echo.!strlen!:%%a>>temp1.txt
- )
- cd.>"%fname%"
- for /f "tokens=1,* delims=:" %%a in ('sort temp1.txt') do (echo %%b>>"%fname%")
- :end ==============================================================
- for /l %%a in (5,-1,1) do (set/p =退出... ^(%%a^)<nul&ping/n 2 127.1>nul)
- del temp1.txt
- exit /b
-
- ::=======================获得字符串长度==============================
- ::返回值在中%strlen%
- :getStrLen mystr
- set "mystr=%~1"&set "strlen=0"
- if not defined mystr goto :eof
- for /l %%i in (0,1,8191) do (set strlen=%%i&if "!mystr:~%%i,1!"=="" (goto :eof))
- goto :eof
- ::==============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
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in (03.txt) do (
- set str=00000000000000000000000000%%a
- set _!str:~-20!=0
- )
- for /f "tokens=2 delims=0=" %%a in ('set _') do echo %%a
- pause
复制代码
对set str=00000000000000000000000000%%a和set _!str:~-20!=0可以根据自己的需求自己定义一下长度
作者: zqz0012005 时间: 2010-9-10 21:00
为避免以0开头的行被误处理及兼容特殊字符,来段js- fso = new ActiveXObject('Scripting.FileSystemObject');
- s = fso.OpenTextFile('01.txt').ReadAll().replace(/\r/g,''); //'\r'非常恶心!
- if (s.slice(-1)=='\n') s=s.slice(0,-1); //需要稍作修整,为下面replace(/^/gm,head)
- head=new Array(1000).join('.')+':'; //head为1000个.加一个:
- s=s.replace(/^/gm,head).match(/.{1000}$/gm).sort().join('\r\n').replace(/^\.+:/gm,'');
- fso.OpenTextFile('02.txt',2,true).Write(s);
复制代码
作者: zqz0012005 时间: 2010-9-10 22:21
再来个jsfso = 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
- 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 |