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

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

本帖最后由 思想之翼 于 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、对于出现次数相同的数据,如果不是从小到大排列,而是随机排列
   对于未出现的数据,也不是从小到大排列,也随机排列
   如何解决?
2

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2
    • pcl_test: 未按版规发帖PB -4

引用的代码贴出原帖链接并指明相应楼层即可,勿重复贴码

TOP

第一个问题,试试:
  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

评分人数

TOP

本帖最后由 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

评分人数

TOP

本帖最后由 思想之翼 于 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
回车符

TOP

本帖最后由 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

评分人数

TOP

本帖最后由 思想之翼 于 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
那么,代码如何表示 分割列?

TOP

20行的\S+改成\S就行了
1

评分人数

TOP

返回列表