找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 26539|回复: 3

[文本处理] 【已解决】求助:删除最后四位数相同的重复行

[复制链接]
发表于 2017-11-19 18:47:33 | 显示全部楼层 |阅读模式
本帖最后由 思想之翼 于 2017-11-26 11:40 编辑

名称为01的文件夹内,有70个文本,名称为01、02...70,每个文本有若干行数据,格式如下:
4895172 4907(删除该行)
4895173 4907(删除该行)
4895174 7650
4895175 4907
4895176 3990(删除改行)
4895177 3990

若文本中各行数据存在最后四位数相同,则删除重复行,仅保留一行。
上例中,删除重复行后的新文本为:
4895174 7650
4895175 4970
4895177 3990

新文本数据覆盖原文本数据
发表于 2017-11-19 23:54:00 | 显示全部楼层
本帖最后由 WHY 于 2017-11-20 22:03 编辑
  1. @if(0)==(0) echo off
  2. dir /b *.txt | cscript //nologo //e:jscript "%~f0"
  3. pause & goto :EOF
  4. @end

  5. var fso = new ActiveXObject('Scripting.FileSystemObject');
  6. while(!WSH.StdIn.AtEndOfStream) getUnique(WSH.StdIn.ReadLine());

  7. function getUnique(strFile){
  8.     var objFile = fso.OpenTextFile(strFile, 1);   //打开文件
  9.     var arr = objFile.ReadAll().split('\r\n');    //读取文件内容,按行分割数组
  10.     objFile.Close();                              //文件关闭
  11.     var len = arr.length, map = [];
  12.     for(var i=len-1; i>=0; i--){                  //反序遍历数组
  13.         var m = arr[i].match(/^\S+\s+(\S+)$/);    //正则匹配 arr 数组每个元素
  14.         if(m){                                    //如果匹配成功
  15.             if(!map[m[1]]){                       //如果 map[m[1]] 未定义
  16.                 map[m[1]] = 1;                    //变量 map[m[1]] 赋值为 1
  17.             }else {                               //否则,如果已定义 map[m[1]]
  18.                 arr.splice(i, 1);                 //移除arr数组第i个元素
  19.             }
  20.         }else {
  21.             arr.splice(i, 1);                     //匹配失败,移除arr数组第i个元素
  22.         }
  23.     }
  24.     fso.OpenTextFile(strFile, 2).WriteLine(arr.join('\r\n'));    //打开并写入文本
  25. }
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 谢谢!运行正常!

查看全部评分

 楼主| 发表于 2017-11-20 00:02:32 | 显示全部楼层
本帖最后由 思想之翼 于 2017-11-20 00:04 编辑

回复 2# WHY
谢谢!运行正常
发表于 2017-11-21 11:18:16 | 显示全部楼层
没想到改成 splice 方法后效率低到没底线,算了,换成修改之前的方案。
  1. @if(0)==(0) echo off
  2. dir /b *.txt | cscript //nologo //e:jscript "%~f0"
  3. pause & goto :EOF
  4. @end

  5. var fso = new ActiveXObject('Scripting.FileSystemObject');
  6. while(!WSH.StdIn.AtEndOfStream) getUnique(WSH.StdIn.ReadLine());

  7. function getUnique(strFile){
  8.     var objFile = fso.OpenTextFile(strFile, 1);      //打开文件
  9.     var arrIn = objFile.ReadAll().split('\r\n');     //读取文件内容,按行分割数组
  10.     objFile.Close();                                 //文件关闭
  11.     var len = arrIn.length, arrOut = [], map = [];
  12.     for(var i=len-1; i>=0; i--){                     //反序遍历数组
  13.         var m = arrIn[i].match(/^\S+\s+(\S+)$/);     //正则匹配
  14.         if(m) if(!map[m[1]]){                        //如果匹配成功, map[m[1]] 无定义
  15.             arrOut.push(m[0]);                       //整行添加到 arrOut 数组
  16.             map[m[1]] = 1;                           //map[m[1]] 赋值为 1
  17.         }
  18.     }
  19.     fso.OpenTextFile(strFile, 2).WriteLine(arrOut.reverse().join('\r\n'));//写入文本
  20. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 00:18 , Processed in 0.018780 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表