Board logo

标题: [文本处理] [已解决]BAT怎样按长短排序,从长排到短。 [打印本页]

作者: 每天几分    时间: 2012-11-4 15:01     标题: [已解决]BAT怎样按长短排序,从长排到短。

本帖最后由 每天几分 于 2012-11-4 21:30 编辑

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

示例:
……
方法
凤飞飞

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

希望得到的结果:

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

……
作者: apang    时间: 2012-11-4 16:29

本帖最后由 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)
复制代码

作者: 每天几分    时间: 2012-11-4 17:09

回复 2# apang


    可以是可以……但效率有点慢,3万行的文本500K,花了10多分钟才完成……
作者: apang    时间: 2012-11-4 19:09

回复 3# 每天几分


    水平有限,想不出什么好招数了。。。
   不知道有没有第三方工具可以对付大文本进行长度排序
作者: Demon    时间: 2012-11-4 19:18

回复  每天几分


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



    换种效率高点的排序算法。
作者: 每天几分    时间: 2012-11-4 19:48

回复 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

回复 7# Demon


    不行啊,生成的是空白文本……
作者: CrLf    时间: 2012-11-4 21:13

本帖最后由 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
复制代码

作者: Demon    时间: 2012-11-4 21:40

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



    以前在老外的网站上看到过排序效率对比,ado并不是最高效的,网址找不到了,你可以自己测试各种排序算法。
作者: CrLf    时间: 2012-11-4 21:44

回复 9# Demon


    噢,多谢提示,我找找去~
   话说在网上看到用 System.Collections.ArrayList 来排序的办法,但是需要 .net 环境,且不知如何简易地按长度排序...
作者: Demon    时间: 2012-11-4 21:49

回复  Demon


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



    http://demon.tw/programming/vbs-and-net-framework.html
作者: apang    时间: 2012-11-4 23:25

回复 5# Demon


    感谢Demon!
网上找到一些排序的资料,看了近2个小时,云山雾罩的。。。太菜了,呵呵。。。
作者: Batcher    时间: 2012-11-5 07:07

楼主,8楼的方法一比方法二慢多少?
作者: 每天几分    时间: 2012-11-5 09:06

回复 13# Batcher


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

第一个是在窗口显示,没有在原文本保存排序,也没有生成新文本……如果能修改一下代码或许会不一样……
作者: 每天几分    时间: 2012-11-5 09:47

回复 13# Batcher


    大文本我找到解决方法了,用TextPro这个软件,测试了一个20MB的文本,速度相当快,几秒就搞定了。




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