标题: [文本处理] 【已解决】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文件- 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();
- }
- }
- }
复制代码
作者: cfwyy77_bat 时间: 2019-8-19 10:25
本帖最后由 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)
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |