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

[文件操作] [已解决]如何提取和替换文本指定特征的字符并以这些字符匹配文件名来对文本进行归类?

本帖最后由 xp3000 于 2016-4-6 13:54 编辑

如何bat+jscript提取文本字符串新建文件夹、替换文本,根据提取字符串列表对比文件名,移动文件名含提取字符串的文件到文件夹

有大量TXT文件,文件有可能是UTF-8或ANSI编码,
1、提取所有文本内容第*卷信息,并且输出到:统计.log,
比如第*卷为第一卷,第一五卷,第二六卷...第卅卷,这个后面用来新建文件夹用,

2、用正则表达式将第(中文数字)(中文数字)卷替换为第(中文数字)十(中文数字)卷,
第卅卷替换为第三十卷,同时第*卷前面的          替换为空值,
例如:
        第一五卷
替换
第一十五卷
……
第卅卷
替换
第三十卷

3、根据统计.log里面关键字新建文件夹,这时候新建的文件夹第一五卷...第二六卷...第卅卷……
4、然后将文件名中含关键字的TXT,移动到各自分类的文件夹里面去。
比如:
文件名含“第一卷”字符串,将他们移动到第一卷文件夹里面去,文件名含“第二卷”,将他们移动到第二卷文件夹里面去
1

评分人数

“提取所有文件第*卷信息”指定是文件名中的还是文本内容里面的?替换的又是文件名中的还是文本内容里面的?

TOP

回复 1# xp3000
看不懂你的描述,无法理解的句子。

TOP

回复 3# happy886rr


    提取文本内容里面的字符串

TOP

本帖最后由 pcl_test 于 2016-4-6 00:29 编辑

  1. <!-- :
  2. @echo off
  3. for /f "delims=" %%a in ('dir /a-d/b *.txt^|mshta "%~f0"') do (
  4.     if exist "*%%a*.txt" (
  5.         md "%%a\" 2>nul
  6.         move "*%%a*.txt" "%%a\"
  7.     )
  8. )
  9. pause&exit
  10. -->
  11. <script src=http://www.bathome.net/lib/diy/hide.js></script>
  12. <script src=http://www.bathome.net/lib/diy/iconv.js></script>
  13. <script>
  14. var fso = new ActiveXObject('Scripting.Filesystemobject');
  15. var StdIn = fso.GetStandardStream(0);
  16. var StdOut = fso.GetStandardStream(1);
  17. var txtfiles = StdIn.ReadAll().split(/\r\n/);
  18. var log = fso.CreateTextFile('统计.log', 2);
  19. var s = f = '', arr = {};
  20. for(var i = 0; i<txtfiles.length; i++){
  21.     var bin = iconv.load(txtfiles[i]);
  22.     var bom = iconv.checkBom(bin);
  23.     if(bom == 'undefined'){bom = iconv.toStr(bin, 'gb2312')?'gb2312':'utf-8';}
  24.     var txt = iconv.toStr(bin, bom);
  25.     var t = '';
  26.     var str = txt.replace(/[ \t]*(第[零一二三四五六七八九十百千廿卅卌]+?卷)/g, function($0, $1){
  27.         if(!arr[$1]){
  28.             arr[$1] = 1;
  29.             f += $1 +'\r\n';
  30.         }
  31.         t += $1 +',';
  32.         var r = $1.replace(/[廿卅卌]/, function(a){return a=='廿'?'二十':a=='卅'?'三十':'四十'});
  33.         return /第[一二三四五六七八九]{2}卷/.test(r)?r.substr(0, 2)+ '十' +r.substr(2, 2):r;
  34.     });
  35.     iconv.saveText(str, txtfiles[i], bom);
  36.     s += fso.GetFile(txtfiles[i]).Name+ '\r\n' +t+ '\r\n\r\n';
  37. }
  38. log.Write(s);
  39. StdOut.Write(f);
  40. </script>
复制代码
2

评分人数

TOP

打雷学习中,下午打雷断电了,看懂一部分,刚开始能,后来不能了,不知道为什么失效了,
还有两个问题,如果提取的第*卷信息,不管有多少个,统计.log只统计一次,
也就是第一卷到第卅卷有三十个,重复或不重复的,在统计.log里面只列出他们三十行,修改哪里?

如果是只提取文件名的第*卷信息,并且输出到:统计.log
修改哪里?

TOP

去重
……
      if(!arr[$1]){
            arr[$1] = 1;
            f += $1 +'\r\n';
            t += $1 +',';
      }
     //t += $1 +',';
……
1

评分人数

TOP

提取文件名指定特征的字符串
  1. //&cls&(dir /a-d/b *.txt)|cscript -nologo -e:jscript "%~f0"&pause&exit
  2. WSH.echo(WSH.StdIn.ReadAll().match(/第[零一二三四五六七八九十百千廿卅卌]+?卷/g).join('\r\n'));
复制代码
1

评分人数

TOP

返回列表