找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 84814|回复: 21

[文本处理] 批处理如何将txt文本里的内容根据每一行行首的字符按字母、数字到中文的先后次序排序

[复制链接]
发表于 2012-3-16 21:16:44 | 显示全部楼层 |阅读模式
本帖最后由 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万行路径】
发表于 2012-3-16 21:24:05 | 显示全部楼层
回复 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 个字符的行排在其他行之前。按默认值,从每行的第一个字符开始比较。
发表于 2012-3-16 21:24:50 | 显示全部楼层
Excel2007可以超过6万行的吧
发表于 2012-3-16 21:33:54 | 显示全部楼层
dir  里面不是自带按字母排序功能的吗?
干嘛等搜索出文件名后才想到排序呢?
发表于 2012-3-16 21:37:42 | 显示全部楼层
回复 2# cjiabing


sort能把数字排到后面?你给个命令大家学习下?
发表于 2012-3-16 21:38:43 | 显示全部楼层
回复 4# BAT1


这个不像是dir出来的吧
发表于 2012-3-16 21:45:03 | 显示全部楼层
回复 6# find


    出个脑残的主意先映射一个“虚拟盘”,然后把“空目录”恢复到这个盘里面,再用 dir 加 按文件名排序的参数,重新提出目录名。
发表于 2012-3-16 21:50:31 | 显示全部楼层
回复 7# BAT1


十几万个啊,效率无法接受。
发表于 2012-3-16 21:55:13 | 显示全部楼层
本帖最后由 BAT1 于 2012-3-16 22:03 编辑

回复 8# find


    如果用FOR进行循环比较的话,估计,效率会成几何递减,那样的话,效率更难接受吧。

看到楼主想到过用EXCEL,如果用FOR 只按字母、数字、中文字符进行分离,把大文件按一定的规则,分割成三个小一点的文件(如字母开头的放一个文件,数字开头的放一个文件,中文开头放一个文件,……)然后再用EXCEL进行排序,情况会不会有好转?
如果某个字母开头的特别多,再针对某个字母再次分离出来(比如C特别多,那就把大文件分开来一个有C,一个无C)用EXCEL单独排序。
发表于 2012-3-16 22:16:38 | 显示全部楼层
回复 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
复制代码
发表于 2012-3-16 22:21:14 | 显示全部楼层
回复 10# find


    先别急着写代码,先想思路,一条好的思路,有时候能顶十多条代码。

评分

参与人数 1技术 +1 收起 理由
Rasm + 1 我赞同你的观点

查看全部评分

发表于 2012-3-16 22:23:39 | 显示全部楼层
回复 11# BAT1


3楼回帖之前代码已经写好了,你有更高效的就拿出来学习下。
发表于 2012-3-16 22:27:44 | 显示全部楼层
回复 5# find


    菜鸟,如果你没试过就不要乱喊喳喳!
发表于 2012-3-16 22:46:46 | 显示全部楼层
回复 13# cjiabing


求高人指点高效代码
发表于 2012-3-16 23:05:56 | 显示全部楼层
回复 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不依不饶的纠缠不清,那就是不尊重兄弟了,故而本人有时候也会莫名火起,恳请谅解。每个人都有不足,也有优点,希望能向你学习!

评分

参与人数 1技术 +1 收起 理由
Rasm + 1 多谢交流

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 15:01 , Processed in 0.024227 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表