Board logo

标题: [文本处理] 【已解决】BAT或VBS:如何将各列数据进行全组合 [打印本页]

作者: 思想之翼    时间: 2019-8-18 09:53     标题: 【已解决】BAT或VBS:如何将各列数据进行全组合

本帖最后由 思想之翼 于 2019-8-19 09:42 编辑

E:/数据1/有若干文本,文本名称为0001 0002 0003......每个文本中有七列数据,每列数据由TAB间隔,每列数据长短不一,格式如下:
8        5        2        6        4        5        4
          2                  7                                                                       
欲将每个文本内各列数据进行全组合,写入E:/数据2/
如上例数据全组合成:
8526454
8527454
8226454
8227454
用BAT或VBS如何实现?
作者: netdzb    时间: 2019-8-18 13:52

回复 1# 思想之翼

直接copy合并可以吗?
作者: 思想之翼    时间: 2019-8-18 13:57

回复 2# netdzb
感谢关注!任何方法均可,八仙过海,各显神通。
作者: Batcher    时间: 2019-8-18 17:49

回复 2# netdzb


    你可能没有理解楼主的说的【组合】是什么意思
作者: 思想之翼    时间: 2019-8-18 18:10

回复 4# Batcher
为了说明问题,简化为3列数据,并以字母代替数字
第一位  第二位  第三位
A          B        C         
D          E        F
            G   
组合成3位数,第一列AD在第一位,  第二列BEG在第二位,第三列CF在第三位,  即:
ABC
ABF
AEC
AEF
AGC
AGF
DBC
DBF
DEC
DEF
DGC
DGF
作者: netdzb    时间: 2019-8-18 19:49

回复 1# 思想之翼

看懂意思了,不会啊。
作者: flashercs    时间: 2019-8-19 07:20

保存为.js文件
  1. var fso = WScript.CreateObject('Scripting.FileSystemObject'),
  2.   srcdir = 'E:/数据1',
  3.   dstdir = 'E:/数据2';
  4. for (colFiles = new Enumerator(fso.GetFolder(srcdir).Files); !colFiles.atEnd(); colFiles.moveNext()) {
  5.   var ofile = colFiles.item();
  6.   try {
  7.     var tsread = ofile.OpenAsTextStream(1, -2);
  8.     var tswrite = fso.OpenTextFile(fso.BuildPath(dstdir, ofile.Name),2,true,-2);
  9.     var arrLines = [],
  10.       maxCols = 0;
  11.     while (!tsread.atEndOfStream) {
  12.       var arrSplit = tsread.readline().split('\t');
  13.       arrLines.push(arrSplit);
  14.       maxCols = Math.max(maxCols, arrSplit.length);
  15.     }
  16.     var arrColumns = Array(maxCols);
  17.     for (var i = maxCols - 1; i >= 0; i--) {
  18.       arrColumns[i] = [];
  19.     }
  20.     for (i = 0; i < arrLines.length; i++) {
  21.       for (var j = arrLines[i].length - 1; j >= 0; j--) {
  22.         if (arrLines[i][j] !== '') {
  23.           arrColumns[j].push(arrLines[i][j]);
  24.         }
  25.       }
  26.     }
  27.     // permute
  28.     var arrOut = [''];
  29.     for (i = arrColumns.length - 1; i >= 0; i--) {
  30.       var arrOut_ = [];
  31.       for (j = 0; j < arrColumns[i].length; j++) {
  32.         for (var k = 0; k < arrOut.length; k++) {
  33.           arrOut_.push(arrColumns[i][j] + arrOut[k]);
  34.         }
  35.       }
  36.       arrOut = arrOut_;
  37.     }
  38.     // WSH.Echo(arrOut);
  39.     tswrite.writeline(arrOut.join('\r\n'));
  40.   } catch (e) {
  41.     WScript.Echo(e.message);
  42.     continue
  43.   } finally {
  44.     if(tsread){
  45.       tsread.close();
  46.     }
  47.     if(tswrite){
  48.       tswrite.close();
  49.     }
  50.   }
  51. }
复制代码

作者: cfwyy77_bat    时间: 2019-8-19 10:25

本帖最后由 cfwyy77_bat 于 2019-8-19 10:26 编辑

关键就是对每列集合 生成笛卡尔积,感觉用python会比较方便的。写了个玩玩,仅供参考。
  1. from itertools import product
  2. import os
  3. srcDir="E:/数据1"
  4. dstDir="E:/数据2"
  5. txtfiles=[f for f in os.listdir(srcDir) if f.endswith("txt") and os.path.isfile(f)]
  6. for txt in txtfiles:
  7.     with open(txt,encoding="utf-8") as f:
  8.         lines = [line.strip("\n").split("\t") for line in f]        
  9.     columns = [[i for i in colHasEmpty if i] for colHasEmpty in zip(*lines)]
  10.     with open(os.path.join(dstDir,txt),"w",encoding="utf-8") as fw:
  11.         for i in product(*columns):               
  12.             print("".join(i),file=fw)  
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2