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

[文本处理] 【已解决】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文件
  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. }
复制代码
1

评分人数

微信:flashercs
QQ:49908356

TOP

本帖最后由 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)  
复制代码
1

评分人数

TOP

返回列表