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

[文本处理] 【已解决】批处理:按数据出现次数多少排序 次数相同的 如何按出现先后顺序排序

[复制链接]
发表于 2015-12-16 13:00:25 | 显示全部楼层 |阅读模式
本帖最后由 思想之翼 于 2015-12-16 21:17 编辑
  1. @set @n=0;/* & echo off
  2. set "fd=c:\数据2\新文本"
  3. md "%fd%" 2>nul
  4. pushd c:\数据2\
  5. dir /b *.txt | cscript -nologo -e:jscript "%~0" "%fd%"
  6. pause & exit
  7. */

  8. var fd = WScript.Arguments(0);
  9. var fso = new ActiveXObject('Scripting.FileSystemObject');

  10. while (!WScript.StdIn.AtEndOfStream) {
  11.         var f = WScript.StdIn.ReadLine();
  12.         var arr = readTextFile(f).split('\r\n');
  13.         var str = '';
  14.         for(var i=0; i<arr.length; i++){
  15.                 if (!/^\s*$/.test(arr[i])) str += getNum(arr[i]) + '\r\n';
  16.         }
  17.         fso.OpenTextFile(fd + f, 2, true).Write(str)
  18. }

  19. function readTextFile(strFile) {
  20.         var objFile = fso.OpenTextFile(strFile, 1);
  21.         var s = objFile.ReadAll();
  22.         objFile.Close(); objFile = null;
  23.         return s
  24. }

  25. function getNum(s) {
  26.         var ar = [];
  27.         for (var i=0; i<=9; i++) {
  28.                 ar.push(s.split(i).length + "=" + i);
  29.         }
  30.         ar.sort(function(x,y){return y.split("=")[0]-x.split("=")[0]});
  31.         return ar.join(" ").replace(/\d+=/g, "");
  32. }
复制代码
txt文本数据格式格式为:
1 2 3 4 5 6 7 8 9 0 1 2
9 8 7 6 5 4 3 2 1 0 0 9
... ...  ... ...
上述代码是 逐行按出现次数从多到少排序,出现次数相同的,则从小到大排列,未出现的数据也是从小到大排列,排序结果写入另一个txt文本

现在有2个疑问,没有头绪:
1、对于出现次数相同的数据,如果不是从小到大排列,而是按照出现先后顺序排列,如何解决?
比如:9 8 7 6 5 4 3 2 1 0 0 9
9 0出现2次,8 7 6 5 4 3 2 1出现1次
排序为 9 0 8 7 6 5 4 3 2 1

2、对于出现次数相同的数据,如果不是从小到大排列,而是随机排列
   对于未出现的数据,也不是从小到大排列,也随机排列
   如何解决?

评分

参与人数 2PB -2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样
pcl_test -4 未按版规发帖

查看全部评分

发表于 2015-12-16 13:16:19 | 显示全部楼层
引用的代码贴出原帖链接并指明相应楼层即可,勿重复贴码
发表于 2015-12-16 19:37:36 | 显示全部楼层
第一个问题,试试:
  1. function getNum(s) {
  2.         var ar = [];
  3.         for (var i=0; i<=9; i++) {
  4.                 var x = 100000000000000 - s.split(i).length;
  5.                 var y = 100000000000001 + s.indexOf(i);
  6.                 ar.push(x + '=' + y + '=' + i);
  7.         }
  8.         return ar.sort().join(' ').replace(/\d+=\d+=/g, '');
  9. }
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢

查看全部评分

发表于 2015-12-16 19:48:35 | 显示全部楼层
本帖最后由 WHY 于 2015-12-16 19:52 编辑

问题2,试试:
  1. function getNum(s) {
  2.         var ar = [], map = {};
  3.         for (var i=0; i<=9; i++) {
  4.                 var len = s.split(i).length;
  5.                 map[len] = map[len] ? map[len] + ' ' + i : i+'';
  6.         }
  7.         for(i in map) {
  8.             var j = map[i].split(' ').sort(function(){return Math.random()-0.5}).join(' ');
  9.             ar.push(j);
  10.         }
  11.         ar.sort(function(){return Math.random()-0.5});
  12.         return ar.join(' ')
  13. }
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢

查看全部评分

 楼主| 发表于 2015-12-19 18:05:13 | 显示全部楼层
本帖最后由 思想之翼 于 2015-12-19 23:40 编辑

回复 3# WHY 感谢您的帮助!上述代码是逐行按出现次数排序,如果逐列按出现次数排序,相同次数的按出现顺序排序,排序结果为:竖排,去除空格,最后一行数据有回车符。如何实现?
比如文本数据为:
9 9 9 9
8 8 8 8
7 7 7 7
6 6 6 6
5 5 5 5
4 4 4 4
3 3 3 3
2 2 2 2
1 1 1 1
0 0 0 0
0 0 0 0
9 9 9 9
第1-4列排序结果为
9 9 9 9
0 0 0 0
8 8 8 8
7 7 7 7
6 6 6 6
5 5 5 5
4 4 4 4
3 3 3 3
2 2 2 2
1 1 1 1
去除空格:
9999
0000
8888
7777
6666
5555
4444
3333
2222
1111
回车符
发表于 2015-12-20 21:08:00 | 显示全部楼层
本帖最后由 WHY 于 2015-12-22 16:46 编辑
  1. @set @n=0;/* & echo off
  2. set "fd=D:\数据\新文本"
  3. md "%fd%" 2>nul
  4. pushd D:\数据\
  5. dir /b *.txt | cscript -nologo -e:jscript "%~0" "%fd%"
  6. pause & exit
  7. */

  8. var fd = WScript.Arguments(0);
  9. var fso = new ActiveXObject('Scripting.FileSystemObject');

  10. while (!WScript.StdIn.AtEndOfStream){
  11.     var file = WScript.StdIn.ReadLine();
  12.     var arrRow = readTextFile(file).split('\n'); //分割行
  13.     var x = [], y = [], max = 0;

  14.     //文本数据存放在数组x
  15.     for(var i=0; i<arrRow.length; i++){
  16.         x[i] = arrRow[i].match(/\S/g); //分割列
  17.         if (x[i].length > max) max = x[i].length //最大列数
  18.     }

  19.     //每一列数据拼接成字符串、排序、存放在数组y
  20.     for(var i=0; i<max; i++){
  21.         var s = '';
  22.         for(var j=0; j<arrRow.length; j++) s += x[j][i];
  23.         y[i] = getNum(s);
  24.     }

  25.     //重组数据、输出
  26.     var s = '';
  27.     for(i=0; i<=9; i++){
  28.         var s1 = '';
  29.         for(var j=0; j<max; j++) s1 += ' ' + y[j][i];
  30.         s += s1.replace(/ \d+=\d+=/g, '') + '\r\n';
  31.     }
  32.     fso.OpenTextFile(fd + file, 2, true).Write(s);
  33. }

  34. function readTextFile(strFile){
  35.     var objFile = fso.OpenTextFile(strFile, 1);
  36.     var s = objFile.ReadAll() + '\n';
  37.     s = s.replace(/(\s*\n)+/g, '\n').replace(/^\n|\n$/g, '');
  38.     objFile.Close(); objFile = null;
  39.     return s
  40. }

  41. function getNum(s) {
  42.     var ar = [];
  43.     for (var i=0; i<=9; i++) {
  44.         var s1 = 100000000000000 - s.split(i).length;
  45.         var s2 = 100000000000001 + s.indexOf(i);
  46.         ar.push(s1 + '=' + s2 + '=' + i);
  47.     }
  48.     return ar.sort();
  49. }
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢

查看全部评分

 楼主| 发表于 2015-12-20 21:58:09 | 显示全部楼层
本帖最后由 思想之翼 于 2015-12-20 22:40 编辑

回复 6# WHY
感谢您的帮助!学习中...
若待排序的文本数据列与列之间没有空格,比如将有空格的文本:
9 9 9 9
8 8 8 8
7 7 7 7
6 6 6 6
5 5 5 5
4 4 4 4
3 3 3 3
2 2 2 2
1 1 1 1
0 0 0 0
0 0 0 0
9 9 9 9
改为无空格的文本:
9999
8888
7777
6666
5555
4444
3333
2222
1111
0000
0000
9999
那么,代码如何表示 分割列?
发表于 2015-12-20 22:53:49 | 显示全部楼层
20行的\S+改成\S就行了

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 05:47 , Processed in 0.019788 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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