返回列表 发帖

[文本处理] 【已解决】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如何实现?

回复 1# 思想之翼

直接copy合并可以吗?

TOP

回复 2# netdzb
感谢关注!任何方法均可,八仙过海,各显神通。

TOP

回复 2# netdzb


    你可能没有理解楼主的说的【组合】是什么意思
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 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

TOP

回复 1# 思想之翼

看懂意思了,不会啊。

TOP

保存为.js文件
var fso = WScript.CreateObject('Scripting.FileSystemObject'),
  srcdir = 'E:/数据1',
  dstdir = 'E:/数据2';
for (colFiles = new Enumerator(fso.GetFolder(srcdir).Files); !colFiles.atEnd(); colFiles.moveNext()) {
  var ofile = colFiles.item();
  try {
    var tsread = ofile.OpenAsTextStream(1, -2);
    var tswrite = fso.OpenTextFile(fso.BuildPath(dstdir, ofile.Name),2,true,-2);
    var arrLines = [],
      maxCols = 0;
    while (!tsread.atEndOfStream) {
      var arrSplit = tsread.readline().split('\t');
      arrLines.push(arrSplit);
      maxCols = Math.max(maxCols, arrSplit.length);
    }
    var arrColumns = Array(maxCols);
    for (var i = maxCols - 1; i >= 0; i--) {
      arrColumns[i] = [];
    }
    for (i = 0; i < arrLines.length; i++) {
      for (var j = arrLines[i].length - 1; j >= 0; j--) {
        if (arrLines[i][j] !== '') {
          arrColumns[j].push(arrLines[i][j]);
        }
      }
    }
    // permute
    var arrOut = [''];
    for (i = arrColumns.length - 1; i >= 0; i--) {
      var arrOut_ = [];
      for (j = 0; j < arrColumns[i].length; j++) {
        for (var k = 0; k < arrOut.length; k++) {
          arrOut_.push(arrColumns[i][j] + arrOut[k]);
        }
      }
      arrOut = arrOut_;
    }
    // WSH.Echo(arrOut);
    tswrite.writeline(arrOut.join('\r\n'));
  } catch (e) {
    WScript.Echo(e.message);
    continue
  } finally {
    if(tsread){
      tsread.close();
    }
    if(tswrite){
      tswrite.close();
    }
  }
}COPY
1

评分人数

微信:flashercs
QQ:49908356

TOP

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

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

评分人数

TOP

返回列表