[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

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

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

示例:
……
方法
凤飞飞

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

希望得到的结果:

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

……
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 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

评分人数

TOP

回复 2# apang


    可以是可以……但效率有点慢,3万行的文本500K,花了10多分钟才完成……

TOP

回复 3# 每天几分


    水平有限,想不出什么好招数了。。。
   不知道有没有第三方工具可以对付大文本进行长度排序

TOP

回复  每天几分


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



    换种效率高点的排序算法。

TOP

回复 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
复制代码

TOP

回复 7# Demon


    不行啊,生成的是空白文本……

TOP

本帖最后由 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

评分人数

    • 每天几分: 谢谢!vbs占cup太高了,小文件用第2个快点。 ...技术 + 1

TOP

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



    以前在老外的网站上看到过排序效率对比,ado并不是最高效的,网址找不到了,你可以自己测试各种排序算法。

TOP

回复 9# Demon


    噢,多谢提示,我找找去~
   话说在网上看到用 System.Collections.ArrayList 来排序的办法,但是需要 .net 环境,且不知如何简易地按长度排序...

TOP

回复  Demon


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



    http://demon.tw/programming/vbs-and-net-framework.html

TOP

回复 5# Demon


    感谢Demon!
网上找到一些排序的资料,看了近2个小时,云山雾罩的。。。太菜了,呵呵。。。

TOP

楼主,8楼的方法一比方法二慢多少?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 13# Batcher


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

第一个是在窗口显示,没有在原文本保存排序,也没有生成新文本……如果能修改一下代码或许会不一样……

TOP

回复 13# Batcher


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

TOP

返回列表