Board logo

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

作者: broly    时间: 2011-11-3 23:04     标题: JS版文本分割器

  1. /*
  2. * JS版文本分割器 @BY Broly
  3. * Broly's Blog:www.dreamlikes.net
  4. * From bbs.bathome.net
  5. *
  6. * 简要说明:
  7. * 我已经将分割文本的函数做了封装,
  8. * 只要简单初始化就可以进行分割。
  9. *
  10. * 已知缺点:
  11. * 1.只支持GBK,Unicode,UFT8三种编码,
  12. * 其他编码处理后可能出现乱码。
  13. * 因为其他编码格式不常用,我就
  14. * 没有进行处理了。
  15. * 2.虽然说可以按照处理后的数量或者
  16. * 大小分割,实际只能够精确处理
  17. * Unicode编码的文本。这个是不得
  18. * 已的做法,因为以我的能力,只
  19. * 有这样才不会出现乱码。
  20. *
  21. * 封装的对象:Spliter(filepath,savepath)
  22. * filepath: 要分割的目标文本
  23. * savepath: 存储文件的目录
  24. * 属性:
  25. * filepath: 要分割的目标文本
  26. * savepath: 存储文件的目录
  27. *
  28. * 方法:
  29. * checkEncoding(filepath): 检测文本编码
  30. * filepath: 要分割的目标文本
  31. * splitOnSize(size): 按大小进行分割
  32. * size:分割的大小,单位KB
  33. * splitOnCount(): 按照数量分割
  34. * count:分割的份数,正整数
  35. *
  36. */
  37. /*##############分####隔####线###################*/
  38. function Spliter(_filepath,_savepath)
  39. {
  40. //内部函数:出错提示
  41. function msgError(msg)
  42. {
  43. WScript.Echo(msg);
  44. WScript.Quit();
  45. }
  46. //定义判断文件编码的方法
  47. function _checkEncoding(filepath)
  48. {
  49. //定义变量以存储文件BOM
  50. var bom,encoding;
  51. //初始化Adodb.Stream对象
  52. var objStream = new ActiveXObject("Adodb.Stream");
  53. with(objStream)
  54. {
  55. type = 2;
  56. mode = 3;
  57. charset = "437";
  58. open();
  59. loadFromFile(filepath);
  60. bom = readtext(2);
  61. close();
  62. }
  63. //用escape()函数返回字符十六进制
  64. switch(escape(bom))
  65. {
  66. // FF FE
  67. case '%A0%u25A0':
  68. encoding = 'Unicode';
  69. break;
  70. // EF BB
  71. case '%u2229%u2557':
  72. encoding = 'UTF-8';
  73. break;
  74. //默认是GBK,如果都不是这三种编码处理后有可能出现乱码
  75. default:
  76. encoding = 'GBK';
  77. break;
  78. }
  79. //释放内存
  80. objStream = null;
  81. //返回编码类型
  82. return encoding;
  83. }
  84. //获取文件信息函数,在内部使用
  85. function getFileSize(filepath,savepath)
  86. {
  87. var fso = new ActiveXObject("Scripting.FileSystemObject");
  88. try
  89. {
  90. if(!fso.FileExists(filepath))
  91. {
  92. throw "源文件不存在";
  93. }
  94. var filesize = fso.GetFile(filepath).Size;
  95. if(filesize == 0)
  96. {
  97. throw "文件为空或者不存在";
  98. }
  99. if(!fso.FolderExists(savepath))
  100. {
  101. throw "存储目录不存在";
  102. }
  103. }
  104. catch(ex)
  105. {
  106. msgError(ex);
  107. }
  108. //释放内存
  109. fso = null;
  110. return filesize;
  111. }
  112. //内部使用,分割文件
  113. function splitFile(filepath,savepath,singlesize,srCharset)
  114. {
  115. var objStream = new ActiveXObject("Adodb.Stream");
  116. var arr = new Array();
  117. objStream.Mode = 3;
  118. var i = 0;
  119.   
  120. with(objStream)
  121.     {
  122.     if(srCharset!='Unicode')
  123.     {
  124. type = 2;
  125.         charset = srCharset;
  126.         open();
  127.         loadFromFile(filepath);
  128.         strText = readtext();
  129.         close();
  130.         charset = 'Unicode';
  131.         open();
  132.         writetext(strText);
  133.         position = 0;
  134.         type = 1;
  135.         } else {
  136.          type = 1;
  137.         open();
  138.         loadFromFile(filepath);
  139.         }
  140.         
  141.         arr[0] = read(2);
  142.         while(!EOS){arr[++i] = read(singlesize);}
  143.       close();
  144.       type = 2;
  145.    charset = srCharset;
  146.      }
  147.      
  148.      for(i = 1 ; i<arr.length ; i++)
  149.      {
  150.        with(objStream)
  151.    {
  152.       open();
  153.        writetext(arr[i]);
  154.        saveToFile(savepath + '\\book' + i + '.txt',2);
  155.       close();
  156.        }
  157.      }
  158.    
  159.     //释放内存
  160.     delete arr;
  161.     objStream = null;
  162. }
  163. //定义按照大小分割的方法,单位KB
  164. function _splitOnSize(size)
  165. {
  166. getFileSize(this.filepath,this.savepath);
  167. //获取比较大的单文件字节
  168. var size1 = size*1024;
  169. var size2 = Math.round(size1);
  170. var singlesize = size2>=size1 ? size2 : size2+1;
  171. if(singlesize%2 !=0 ) {singlesize+=1;}
  172. splitFile(this.filepath,
  173.   this.savepath,
  174.   singlesize,
  175.   _checkEncoding(this.filepath)
  176.   );
  177. }
  178. //定义按照数量分割的方法
  179. function _splitOnCount(count)
  180. {
  181. var filesize = getFileSize(this.filepath,this.savepath);
  182. //获取比较大的单文件字节
  183. var size1 = filesize/count;
  184. var size2 = Math.round(size1);
  185. var singlesize = size2>=size1 ? size2 : size2+1;
  186. if(singlesize%2 !=0 ) {singlesize+=1;}
  187. splitFile(this.filepath,
  188.   this.savepath,
  189.   singlesize,
  190.   _checkEncoding(this.filepath)
  191.   );
  192. }
  193. //定义属性
  194. this.filepath = _filepath;
  195. this.savepath = _savepath;
  196. //定义方法
  197. this.checkEncoding = _checkEncoding;
  198. this.splitOnSize = _splitOnSize;
  199. this.splitOnCount = _splitOnCount;
  200. }
  201. /*##############分####隔####线###################*/
  202. //例子:
  203. var objSpliter = new Spliter('d:\\诛仙.txt','d:\\诛仙');
  204. objSpliter.splitOnCount(3);
  205. objSpliter = null;
  206. WScript.Echo('Succeed.');
复制代码

作者: pinke8    时间: 2012-7-4 16:21

看功能貌似比较简单,但代码有些复杂,看看探先




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