Board logo

标题: [原创] VBS版文本分割器 [打印本页]

作者: broly    时间: 2011-1-29 00:20     标题: VBS版文本分割器

此作品暂时有几个缺点:
      1、分割出来的一些文本开头可能会有乱码。(网上查了下,是大多数分割软件的通病。)当然,原因我知道,正在改善中。。
      2、暂时支持GB2312。分割unicode编码文本会乱码。(我有另外一种方法不会出现这情况,但是个人感觉有点麻烦,先研究下这种方法可否改善)
      3、大文本没测试过,小文本测试了,速度还行。
  1. '//VBS版文本分割器 v1.0 @CODE BY Broly
  2. '//我的博客:http://blog.sina.com.cn/brolyblog
  3. '//声明:此代码仅作学习研究之用。使用前请三思而行,产生不良后果均与本人无关!
  4. '//创建分割文本的类SplitText
  5. Class SplitText
  6.   Private mstrName,mstrPath,mary()
  7.   
  8.   Private mobjFSO,mobjStream,mobjFile
  9.   
  10.   Private mi
  11.   
  12.   Private Sub Class_Initialize
  13.     Set mobjFSO = _
  14.       WScript.CreateObject("Scripting.FileSystemObject")
  15.     Set mobjStream = _
  16.       WScript.CreateObject("Adodb.Stream")
  17.   End Sub
  18.   
  19.   Public Property Let Name(strName)
  20.     mstrName=strName
  21.   End Property
  22.   
  23.   Public Property Let SavePath(strPath)
  24.     mstrPath=strPath
  25.   End Property
  26.   
  27.   '//函数SplitOfSize的作用为以文件大小分割,单位为KB
  28.   Public Function SplitOfSize(strFilePath,sngSize)
  29.     If sngSize<=0 Or IsEmpty(sngSize) Then sngSize=100
  30.     Set mobjFile=mobjFSO.GetFile(strFilePath)
  31.     If mobjFile.Size=0 Then Exit Function
  32.     Call SplitFile(mobjFile,Int(mobjFile.Size/sngSize/1024),sngSize*1024)
  33.     Set mobjFile=Nothing
  34.   End Function
  35.   
  36.   '//函数SplitOfCount的作用为以文件数量分割
  37.   Public Function SplitOfCount(strFilePath,intCount)
  38.     If intCount<=0 Or IsEmpty(intCount) Then intCount=10
  39.     Set mobjFile=mobjFSO.GetFile(strFilePath)
  40.     If mobjFile.Size=0 Then Exit Function
  41.     Call SplitFile(mobjFile,intCount-1,mobjFile.Size/intCount)
  42.     Set mobjFile=Nothing
  43.   End Function
  44.   
  45.   Private Sub SplitFile(objFile,intCount,sngSize)
  46.     ReDim mary(intCount)
  47.     With mobjStream
  48.         .Type=1
  49.         .Open
  50.         .LoadFromFile objFile
  51.     End With
  52.     For mi=0 To intCount
  53.       mary(mi)=mobjStream.Read(sngSize)
  54.     Next
  55.     mobjStream.Close
  56.     If IsEmpty(mstrName) Then mstrName=mobjFSO.GetBaseName(objFile)
  57.     If IsEmpty(mstrPath) Then
  58.       mstrPath=mobjFSO.GetParentFolderName(objFile) & "\" & mstrName
  59.       mobjFSO.CreateFolder(mstrPath)
  60.       If Err.Number<>0 Then Err.Clear
  61.     End If  
  62.     For mi=0 To intCount
  63.       With mobjstream
  64.        .Type=1  : .Mode=3 : .Open()
  65.        .Write mary(mi)
  66.        .SaveToFile mstrPath & "\" & _
  67.           mstrName & "_" & mi & ".txt",2
  68.        .Close
  69.       End With
  70.     Next
  71.   End Sub
  72.   
  73.   Private Sub Class_Terminate
  74.     Set mobjFSO=Nothing
  75.     Set mobjStream=Nothing
  76.   End Sub
  77.   
  78. End Class
  79. On Error Resume Next
  80. Dim objSplit,objArgs,strChoice,ary,i
  81. Set objArgs=WScript.Arguments
  82. Set objSplit=New SplitText
  83. '//////////////////////////////////////////////
  84. '//
  85. '//   以下代码是支持几种方式运行:
  86. '//       (注意:如果不设置路径和名称,
  87. '//               将默认创建在脚本当前目录
  88. '//               名称为文本名称。)
  89. '//
  90. '//      1、直接双击运行。
  91. '//
  92. '//      2、将文本文件拖拽至此VBS脚本身上。
  93. '//         此方法默认是分割为10份,保存至当前目录
  94. '//         若要进行修改,可修改此VBS源码。
  95. '//         P.S:支持多文件拖拽
  96. '//
  97. '//      3、命令行下运行,格式:
  98. '//
  99. '//  cscript.exe 文本分割器.vbs 文本路径1 [文本路径2] ......
  100. '//
  101. '//         此方法默认是分割为10份,保存至当前目录
  102. '//         若要进行修改,可修改此VBS源码。
  103. '//
  104. '////////////////////////////////////////////
  105. If objArgs.Count<1 Then
  106.   strChoice=InputBox("请输入分割文本的方式和文本的绝对路径,用“|”隔开:" & _
  107.      vbCrLf & vbCrLf & "1、按数量分割" & vbCrLf & "2、按大小分割(单位KB)" & _
  108.      vbCrLf & vbCrLf & "格式如:1|3|文本路径c:\test.txt|要保存的目录(可选)  即按数量分割为3份" & vbCrLf , _
  109.      "VBS版文本分割器v1.0 @CODE BY Broly")
  110.   ary=Split(strChoice,"|",-1,1)
  111.   '//此处可以设置生成文本的名称,在下一行添加一句:
  112.   '//     objSplit.Name="替换为的你文本名称"
  113.   ReDim Preserve ary(3)
  114.   If Not IsEmpty(ary(3)) Then objSplit.SavePath=ary(3)
  115.   Select Case ary(0)
  116.     Case 1
  117.       objSplit.SplitOfCount ary(2),ary(1)
  118.     Case 2
  119.       objSplit.SplitOfSize ary(2),ary(1)
  120.     Case Else
  121.       MsgBox "输入有误,请重新输入!",vbOKOnly+vbExclamation,"提示"
  122.       WScript.Quit
  123.   End Select
  124.   CreateObject("WScript.Shell").PopUp "已完成所有操作!",2,"提示",64
  125. Else  
  126.   For i=0 To objArgs.Count-1
  127.     '//要设置
  128.     '//注意:要修改分割数量请将下行的10替换为你所想的数
  129.     objSplit.SplitOfCount objArgs.Item(i),10
  130.     '//如果要以固定文本大小分割,请将上句替换为:
  131.     '//objSplit.SplitOfSize objArgs.Item(i),100
  132.     '//同样,要修改分割大小请将上行的100替换为你所想的数(单位KB)
  133.   Next
  134.   WScript.Echo "已完成所有操作!"
  135. End If
  136. Set objSplit=Nothing
  137. WScript.Quit
复制代码

作者: broly    时间: 2011-1-29 13:42

今天用家里的台式机测试了一下,10M的文本居然不用1秒。看来速度还行。
=_=




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