标题: [文本处理] 批处理如何将txt文本里的内容根据每一行行首的字符按字母、数字到中文的先后次序排序 [打印本页]
作者: Rasm 时间: 2012-3-16 21:16 标题: 批处理如何将txt文本里的内容根据每一行行首的字符按字母、数字到中文的先后次序排序
本帖最后由 pcl_test 于 2016-11-19 23:05 编辑
最基本的我会,但现在的问题就是第一行都有一个“/”
如文本里都是这样的路径:
/manage/AdminLogin.aspx
/tmp
/WebEditor/db/ewebeditor.mdb
/wenzhang
/Admin_Login8.php
/Admin_Label.php
/err.php
/logon.php
/open.php.bak
/boss/admin.php
/editor/admin_login.php
/新建文本.txt
/122.php
/2a21.asp
/数据.txt
我想让他们按照 / 后面的字母按字母排序,如果有数字,到排到最后,有中文的话,也排到最后
【因为行数超过6万行,无法用excel,所以想到用批处理】
【大概有19万行路径】
作者: cjiabing 时间: 2012-3-16 21:24
回复 1# Rasm
SORT [/R] [/+n] [/M kilobytes] [/L locale] [/REC recordbytes]
[[drive1:][path1]filename1] [/T [drive2:][path2]]
[/O [drive3:][path3]filename3]
/+n 指定开始每个比较的字符号码 n。/+3 说明每个比较应从每行的第三个字符开始。少于 n 个字符的行排在其他行之前。按默认值,从每行的第一个字符开始比较。
作者: find 时间: 2012-3-16 21:24
Excel2007可以超过6万行的吧
作者: BAT1 时间: 2012-3-16 21:33
dir 里面不是自带按字母排序功能的吗?
干嘛等搜索出文件名后才想到排序呢?
作者: find 时间: 2012-3-16 21:37
回复 2# cjiabing
sort能把数字排到后面?你给个命令大家学习下?
作者: find 时间: 2012-3-16 21:38
回复 4# BAT1
这个不像是dir出来的吧
作者: BAT1 时间: 2012-3-16 21:45
回复 6# find
出个脑残的主意先映射一个“虚拟盘”,然后把“空目录”恢复到这个盘里面,再用 dir 加 按文件名排序的参数,重新提出目录名。
作者: find 时间: 2012-3-16 21:50
回复 7# BAT1
十几万个啊,效率无法接受。
作者: BAT1 时间: 2012-3-16 21:55
本帖最后由 BAT1 于 2012-3-16 22:03 编辑
回复 8# find
如果用FOR进行循环比较的话,估计,效率会成几何递减,那样的话,效率更难接受吧。
看到楼主想到过用EXCEL,如果用FOR 只按字母、数字、中文字符进行分离,把大文件按一定的规则,分割成三个小一点的文件(如字母开头的放一个文件,数字开头的放一个文件,中文开头放一个文件,……)然后再用EXCEL进行排序,情况会不会有好转?
如果某个字母开头的特别多,再针对某个字母再次分离出来(比如C特别多,那就把大文件分开来一个有C,一个无C)用EXCEL单独排序。
作者: find 时间: 2012-3-16 22:16
回复 9# BAT1 - @echo off
- findstr "^/[0-9]" a.txt >num.txt
- findstr "^/[a-zA-Z]" a.txt >en.txt
- sort /+1 en.txt >result.txt
- findstr "^/[0-9]" num.txt >>result.txt
- findstr /v "^/[0-9a-zA-Z]" a.txt >>result.txt
复制代码
作者: BAT1 时间: 2012-3-16 22:21
回复 10# find
先别急着写代码,先想思路,一条好的思路,有时候能顶十多条代码。
作者: find 时间: 2012-3-16 22:23
回复 11# BAT1
3楼回帖之前代码已经写好了,你有更高效的就拿出来学习下。
作者: cjiabing 时间: 2012-3-16 22:27
回复 5# find
菜鸟,如果你没试过就不要乱喊喳喳!
作者: find 时间: 2012-3-16 22:46
回复 13# cjiabing
求高人指点高效代码
作者: cjiabing 时间: 2012-3-16 23:05
回复 14# find
材料:
- /editor/admin_login.php
- /新建文本.txt
- /logon.php
- /open.php.bak
- /boss/admin.php
- /2a21.asp
- /tmp
- /WebEditor/db/ewebeditor.mdb
- /wenzhang
- /数据.txt
- /manage/AdminLogin.aspx
- /122.php
- /Admin_Login8.php
- /Admin_Label.php
- /err.php
复制代码
代码:
-
- @echo off&::把文本文件拖到图标上释放即可 . . .
- findstr /b /v "^/[0-9]" %1|sort&findstr /b "^/[0-9]" %1|sort
- pause
复制代码
sort 本身的排序方式就是“先数字后字母再后中文,以列定行。”。虽然sort有一个倒序功能,sort /r,但按楼主的要求明显不必使用R参数。
可以参照以下例子:
-
- C:\Documents and Settings\甲兵>sort E:\Batch\文本编辑\倒序\test.txt
- /122.php
- /2a21.asp
- /admin_Label.php
- /Admin_Login8.php
- /editor/admin_login.php
- /err.php
- /tmp
- /WebEditor/db/ewebeditor.mdb
- /wenzhang
- /数据.txt
- /新建文本.txt
复制代码
恰好每一行文字的开头都有“/”这一成不变的符号,因此,排序的时候不必考虑它,也不必考虑使用sort /+n,sort会自动从第二列——每行的第二个字符开始排序。
以上代码第一个findstr和sort是获得非数字字符,第二个是单独获得数字字符。——如果按照通常顺序,一个sort %1或sort /r %1就可以了。
题外话,似乎盯上本人了,本人在哪里发言会员find就在哪里质疑本人,精神实在可嘉!本人非计算机专业,玩批也是业余爱好,对计算机和批处理的认识难免存在不足,谢谢find能够及时指出,本人当虚心接受。但假如find的质疑缺乏足够的依据与真诚,本人也不会斤斤计较,但再假如find不依不饶的纠缠不清,那就是不尊重兄弟了,故而本人有时候也会莫名火起,恳请谅解。每个人都有不足,也有优点,希望能向你学习!
作者: BAT1 时间: 2012-3-16 23:18
难道他看上你了?
作者: find 时间: 2012-3-16 23:24
回复 15# cjiabing
论坛不就是用来相互切磋的吗?不切磋就没有共同提高嘛。
就像你这个代码一样,如果楼主仅凭sort命令的帮助文档,估计再过一年半载也不见得能够独立写出来。有你的代码,大家才能学习到。
作者: Rasm 时间: 2012-3-17 20:14
回复 15# cjiabing
@echo off&::把文本文件拖到图标上释放即可 . . .
findstr /b /v "^/[0-9]" %1|sort&findstr /b "^/[0-9]" %1|sort
pause
按照你这条代码,排序了,但是并没有输出到其他文本
如: 1.txt是我要处理的文本,处理后输出2.txt
代码如何写
作者: Rasm 时间: 2012-3-17 20:16
回复 10# find
速度好快,效率不错
作者: find 时间: 2012-3-17 20:18
回复 18# Rasm - @echo off&::把文本文件拖到图标上释放即可 . . .
- findstr /b /v "^/[0-9]" %1|sort&findstr /b "^/[0-9]" %1|sort >2.txt
复制代码
作者: terse 时间: 2012-3-17 20:42
楼上这样 少对括号吧
作者: find 时间: 2012-3-17 21:30
回复 21# terse
嗯,我一般不怎么用&这种写法。- @echo off&::把文本文件拖到图标上释放即可 . . .
- findstr /b /v "^/[0-9]" %1|sort >2.txt
- findstr /b "^/[0-9]" %1|sort >>2.txt
复制代码
- @echo off&::把文本文件拖到图标上释放即可 . . .
- (findstr /b /v "^/[0-9]" %1|sort & findstr /b "^/[0-9]" %1|sort)>2.txt
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |