标题: [文本处理] 【已解决】批处理:按数据出现次数多少排序 次数相同的 如何按出现先后顺序排序 [打印本页]
作者: 思想之翼 时间: 2015-12-16 13:00 标题: 【已解决】批处理:按数据出现次数多少排序 次数相同的 如何按出现先后顺序排序
本帖最后由 思想之翼 于 2015-12-16 21:17 编辑
- @set @n=0;/* & echo off
- set "fd=c:\数据2\新文本\"
- md "%fd%" 2>nul
- pushd c:\数据2\
- dir /b *.txt | cscript -nologo -e:jscript "%~0" "%fd%"
- pause & exit
- */
-
- var fd = WScript.Arguments(0);
- var fso = new ActiveXObject('Scripting.FileSystemObject');
-
- while (!WScript.StdIn.AtEndOfStream) {
- var f = WScript.StdIn.ReadLine();
- var arr = readTextFile(f).split('\r\n');
- var str = '';
- for(var i=0; i<arr.length; i++){
- if (!/^\s*$/.test(arr[i])) str += getNum(arr[i]) + '\r\n';
- }
- fso.OpenTextFile(fd + f, 2, true).Write(str)
- }
-
- function readTextFile(strFile) {
- var objFile = fso.OpenTextFile(strFile, 1);
- var s = objFile.ReadAll();
- objFile.Close(); objFile = null;
- return s
- }
-
- function getNum(s) {
- var ar = [];
- for (var i=0; i<=9; i++) {
- ar.push(s.split(i).length + "=" + i);
- }
- ar.sort(function(x,y){return y.split("=")[0]-x.split("=")[0]});
- return ar.join(" ").replace(/\d+=/g, "");
- }
复制代码
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、对于出现次数相同的数据,如果不是从小到大排列,而是随机排列
对于未出现的数据,也不是从小到大排列,也随机排列
如何解决?
作者: pcl_test 时间: 2015-12-16 13:16
引用的代码贴出原帖链接并指明相应楼层即可,勿重复贴码
作者: WHY 时间: 2015-12-16 19:37
第一个问题,试试:- function getNum(s) {
- var ar = [];
- for (var i=0; i<=9; i++) {
- var x = 100000000000000 - s.split(i).length;
- var y = 100000000000001 + s.indexOf(i);
- ar.push(x + '=' + y + '=' + i);
- }
- return ar.sort().join(' ').replace(/\d+=\d+=/g, '');
- }
复制代码
作者: WHY 时间: 2015-12-16 19:48
本帖最后由 WHY 于 2015-12-16 19:52 编辑
问题2,试试:- function getNum(s) {
- var ar = [], map = {};
- for (var i=0; i<=9; i++) {
- var len = s.split(i).length;
- map[len] = map[len] ? map[len] + ' ' + i : i+'';
- }
- for(i in map) {
- var j = map[i].split(' ').sort(function(){return Math.random()-0.5}).join(' ');
- ar.push(j);
- }
- ar.sort(function(){return Math.random()-0.5});
- return ar.join(' ')
- }
复制代码
作者: 思想之翼 时间: 2015-12-19 18:05
本帖最后由 思想之翼 于 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
回车符
作者: WHY 时间: 2015-12-20 21:08
本帖最后由 WHY 于 2015-12-22 16:46 编辑
- @set @n=0;/* & echo off
- set "fd=D:\数据\新文本\"
- md "%fd%" 2>nul
- pushd D:\数据\
- dir /b *.txt | cscript -nologo -e:jscript "%~0" "%fd%"
- pause & exit
- */
-
- var fd = WScript.Arguments(0);
- var fso = new ActiveXObject('Scripting.FileSystemObject');
-
- while (!WScript.StdIn.AtEndOfStream){
- var file = WScript.StdIn.ReadLine();
- var arrRow = readTextFile(file).split('\n'); //分割行
- var x = [], y = [], max = 0;
-
- //文本数据存放在数组x
- for(var i=0; i<arrRow.length; i++){
- x[i] = arrRow[i].match(/\S/g); //分割列
- if (x[i].length > max) max = x[i].length //最大列数
- }
-
- //每一列数据拼接成字符串、排序、存放在数组y
- for(var i=0; i<max; i++){
- var s = '';
- for(var j=0; j<arrRow.length; j++) s += x[j][i];
- y[i] = getNum(s);
- }
-
- //重组数据、输出
- var s = '';
- for(i=0; i<=9; i++){
- var s1 = '';
- for(var j=0; j<max; j++) s1 += ' ' + y[j][i];
- s += s1.replace(/ \d+=\d+=/g, '') + '\r\n';
- }
- fso.OpenTextFile(fd + file, 2, true).Write(s);
- }
-
- function readTextFile(strFile){
- var objFile = fso.OpenTextFile(strFile, 1);
- var s = objFile.ReadAll() + '\n';
- s = s.replace(/(\s*\n)+/g, '\n').replace(/^\n|\n$/g, '');
- objFile.Close(); objFile = null;
- return s
- }
-
- function getNum(s) {
- var ar = [];
- for (var i=0; i<=9; i++) {
- var s1 = 100000000000000 - s.split(i).length;
- var s2 = 100000000000001 + s.indexOf(i);
- ar.push(s1 + '=' + s2 + '=' + i);
- }
- return ar.sort();
- }
复制代码
作者: 思想之翼 时间: 2015-12-20 21:58
本帖最后由 思想之翼 于 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
那么,代码如何表示 分割列?
作者: WHY 时间: 2015-12-20 22:53
20行的\S+改成\S就行了
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |