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

[文本处理] [已解决]BAT怎样按长短排序,从长排到短。

[复制链接]
发表于 2012-11-4 15:01:06 | 显示全部楼层 |阅读模式
本帖最后由 每天几分 于 2012-11-4 21:30 编辑

几千万行的文本,怎样按长度排序,先排长的,再排短的。

示例:
……
方法
凤飞飞

个各顾各
很好很好很好
淡淡的
凤飞飞反反复复发反反复复反反复复发反反复复反反复复发反反复复反反复复
反反复复
方法分割是
……

希望得到的结果:

凤飞飞反反复复发反反复复反反复复发反反复复反反复复发反反复复反反复复
很好很好很好
方法分割是
个各顾各
反反复复
凤飞飞
淡淡的
方法

……

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2012-11-4 16:29:57 | 显示全部楼层
本帖最后由 apang 于 2012-11-4 16:35 编辑

保存为vbs,试试看吧
  1. Dim FSO,Text,A,T
  2. Set FSO = CreateObject("Scripting.FileSystemObject")
  3. Text = FSO.OpenTextFile("1.txt",1).ReadAll
  4. A = Split(Text,vbCrLf)
  5. For i = 0 To Ubound(A)
  6.    For j = i + 1 To Ubound(A)
  7.       If Len(A(i)) < Len(A(j)) Then
  8.          T = A(i)
  9.          A(i) = A(j)
  10.          A(j) = T
  11.       End If
  12.    Next
  13. Next
  14. FSO.CreateTextFile("2.txt",True).Write Join(A,vbCrLf)
复制代码

评分

参与人数 1技术 +1 收起 理由
每天几分 + 1 我先用着吧……

查看全部评分

 楼主| 发表于 2012-11-4 17:09:08 | 显示全部楼层
回复 2# apang


    可以是可以……但效率有点慢,3万行的文本500K,花了10多分钟才完成……
发表于 2012-11-4 19:09:00 | 显示全部楼层
回复 3# 每天几分


    水平有限,想不出什么好招数了。。。
   不知道有没有第三方工具可以对付大文本进行长度排序
发表于 2012-11-4 19:18:33 | 显示全部楼层
回复  每天几分


    水平有限,想不出什么好招数了。。。
   不知道有没有第三方工具可以对付大文本 ...
apang 发表于 2012-11-4 19:09



    换种效率高点的排序算法。
 楼主| 发表于 2012-11-4 19:48:36 | 显示全部楼层
回复 4# apang

改一下这个可以代码么?它是从短到长排序的,速度很快,几秒就可以了。但反过来,从长到短排序就不会了……
  1.     @echo off&setlocal enabledelayedexpansion
  2.     (for /l %%a in (1 1 50) do (
  3.        set key=!key!.
  4.       findstr /x "!key!" 1.txt
  5.     ))>b.txt
复制代码
 楼主| 发表于 2012-11-4 20:05:23 | 显示全部楼层
回复 7# Demon


    不行啊,生成的是空白文本……
发表于 2012-11-4 21:13:30 | 显示全部楼层
本帖最后由 CrLf 于 2012-11-4 21:36 编辑

awk 和 sed,话说使用临时文件好像比管道快:
  1. gawk "{print 100000+length($0) $0}" 1.txt|sort /r|sed "s/.\{6\}//"
复制代码
若改造楼主提供的代码就是:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1 1 50) do set "key=!key!."
  3. (for /l %%a in (0 1 49) do (
  4.    findstr /x "!key:~%%a!" 1.txt
  5. ))>b.txt
复制代码
vbs 的话,不知道用 ado 会不会快点,这个还是 demon 或者 powerbat 等人比较擅长:
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. Set rs = CreateObject("ADODB.RecordSet")

  3. rs.Fields.Append "length",14,3
  4. rs.Fields.Append "text",200,1000
  5. rs.Open

  6. ts = fso.OpenTextFile("1.txt",1).ReadAll

  7. For Each line In reExecute(ts,".+")
  8.     rs.AddNew
  9.     rs("length") = Len(line)
  10.     rs("text") = line
  11.     rs.Update
  12. Next

  13. rs.Sort = "length DESC"
  14. rs.MoveFirst

  15. Do Until rs.EOF
  16.     str = str & rs("text").value & vbCrLf
  17.     rs.MoveNext
  18. Loop

  19. fso.CreateTextFile("2.txt",True).Write str

  20. Function reExecute(text,pattern)
  21.     Set re = New RegExp
  22.     re.Pattern = pattern
  23.     re.Global = True
  24.     re.MultiLine = True
  25.         
  26.     Set reExecute = re.Execute(text)
  27. End Function
复制代码

评分

参与人数 1技术 +1 收起 理由
每天几分 + 1 谢谢!vbs占cup太高了,小文件用第2个快点。 ...

查看全部评分

发表于 2012-11-4 21:40:08 | 显示全部楼层
awk 和 sed,话说使用临时文件好像比管道快:若改造楼主提供的代码就是:vbs 的话,不知道用 ado 会不会快点 ...
CrLf 发表于 2012-11-4 21:13



    以前在老外的网站上看到过排序效率对比,ado并不是最高效的,网址找不到了,你可以自己测试各种排序算法。
发表于 2012-11-4 21:44:55 | 显示全部楼层
回复 9# Demon


    噢,多谢提示,我找找去~
   话说在网上看到用 System.Collections.ArrayList 来排序的办法,但是需要 .net 环境,且不知如何简易地按长度排序...
发表于 2012-11-4 21:49:38 | 显示全部楼层
回复  Demon


    噢,多谢提示,我找找去~
   话说在网上看到用 System.Collections.ArrayList 来排 ...
CrLf 发表于 2012-11-4 21:44



    http://demon.tw/programming/vbs-and-net-framework.html
发表于 2012-11-4 23:25:16 | 显示全部楼层
回复 5# Demon


    感谢Demon!
网上找到一些排序的资料,看了近2个小时,云山雾罩的。。。太菜了,呵呵。。。
发表于 2012-11-5 07:07:34 | 显示全部楼层
楼主,8楼的方法一比方法二慢多少?
 楼主| 发表于 2012-11-5 09:06:02 | 显示全部楼层
回复 13# Batcher


    测试的小文件(3万行500KB),运行第一个,窗口显示完毕需5秒,而第二个只需3秒。

第一个是在窗口显示,没有在原文本保存排序,也没有生成新文本……如果能修改一下代码或许会不一样……
 楼主| 发表于 2012-11-5 09:47:07 | 显示全部楼层
回复 13# Batcher


    大文本我找到解决方法了,用TextPro这个软件,测试了一个20MB的文本,速度相当快,几秒就搞定了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-19 19:03 , Processed in 0.024758 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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