Board logo

标题: [文本处理] 批处理如何将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
  1. @echo off
  2. findstr "^/[0-9]" a.txt >num.txt
  3. findstr "^/[a-zA-Z]" a.txt >en.txt
  4. sort /+1 en.txt >result.txt
  5. findstr "^/[0-9]" num.txt >>result.txt
  6. 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

材料:
   
  1. /editor/admin_login.php
  2. /新建文本.txt
  3. /logon.php
  4. /open.php.bak
  5. /boss/admin.php
  6. /2a21.asp
  7. /tmp
  8. /WebEditor/db/ewebeditor.mdb
  9. /wenzhang
  10. /数据.txt
  11. /manage/AdminLogin.aspx
  12. /122.php
  13. /Admin_Login8.php
  14. /Admin_Label.php
  15. /err.php
复制代码

代码:
  1. @echo off&::把文本文件拖到图标上释放即可 . . .
  2. findstr /b /v "^/[0-9]" %1|sort&findstr /b "^/[0-9]" %1|sort
  3. pause
复制代码

        sort 本身的排序方式就是“先数字后字母再后中文,以列定行。”。虽然sort有一个倒序功能,sort /r,但按楼主的要求明显不必使用R参数。
        可以参照以下例子:
  1. C:\Documents and Settings\甲兵>sort E:\Batch\文本编辑\倒序\test.txt
  2. /122.php
  3. /2a21.asp
  4. /admin_Label.php
  5. /Admin_Login8.php
  6. /editor/admin_login.php
  7. /err.php
  8. /tmp
  9. /WebEditor/db/ewebeditor.mdb
  10. /wenzhang
  11. /数据.txt
  12. /新建文本.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
  1. @echo off&::把文本文件拖到图标上释放即可 . . .
  2. 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


嗯,我一般不怎么用&这种写法。
  1. @echo off&::把文本文件拖到图标上释放即可 . . .
  2. findstr /b /v "^/[0-9]" %1|sort >2.txt
  3. findstr /b "^/[0-9]" %1|sort >>2.txt
复制代码
  1. @echo off&::把文本文件拖到图标上释放即可 . . .
  2. (findstr /b /v "^/[0-9]" %1|sort & findstr /b "^/[0-9]" %1|sort)>2.txt
复制代码





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