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

[文本处理] 如何把多个EXCEL或者CSV文件行行对应合并到一个EXCEL中

本帖最后由 司马光2008 于 2016-10-14 01:04 编辑

各位,我有几千个EXCEL或者CSV文件需要一起合并到一个EXCEL中,并列排放,中间隔一个空格

打比方:
第一个文件:
AB
12
第二个文件:
CDF
345

合并到一个EXCEL中
AB CDF
12 345

请各位多多帮忙

TOP

使用下面的方式可以合并,但是只能首尾合并,不能并列合并

@echo off
E:
cd xls
dir
copy *.csv all_keywords.csv
echo @@@@@@@@@@@@@合并成功!@@@@@@@@@@@@@'
pause
*****************************

TOP

本帖最后由 DiamondbacK 于 2016-10-13 03:04 编辑

使用第三方程序 gawk。
  1. # 2>nul 3>&2 & echo off & cls
  2. # & gawk -f "%~f0" %1.\*.csv > Merge.csv
  3. # & pause & exit /b
  4. # 使用方法:既可以放在 csv 文件所在目录直接执行,也可以放在别的位置,把 csv 所在目录拖到脚本图标上即可。
  5. BEGIN {
  6.   while ( !isDone++ ) {
  7.     for ( i = 1; i < ARGC; i++ ) {
  8.       if ( getline < ARGV[i] == 1 ) {
  9.         isDone = 0
  10.         printf $0 " "
  11.       }
  12.     }
  13.     print ""
  14.   }
  15. }
复制代码
我自己生成了 1000 个 csv 来测试消耗时间,文件总体积 10.5 MiB,总共耗时 85 秒。CPU 是笔记本 i5 3 代。
1

评分人数

TOP

谢谢 DiamondbacK的回复,但是我只懂一点点批处理

TOP

本帖最后由 pcl_test 于 2016-10-14 01:02 编辑
  1. /*&cls&echo off
  2. del "$合并结果.csv" 2>nul
  3. dir /a-d/b *.csv|cscript -nologo -e:jscript "%~f0">"$.tmp"
  4. ren "$.tmp" "$合并结果.csv"
  5. pause&exit
  6. */
  7. var fso = new ActiveXObject('Scripting.FileSystemObject'), a=[];
  8. while(!WSH.StdIn.AtEndOfStream){
  9.     var line = WSH.StdIn.ReadLine();
  10.     var f = fso.OpenTextFile(line, 1);
  11.     try{
  12.         var txt = f.ReadAll().split(/[\r\n]+/);
  13.         f.Close();
  14.         for(var i=0;i<txt.length;i++)a[i]?a[i]+=' '+txt[i]:a[i]=txt[i];
  15.     }catch(e){}
  16. }
  17. for(var b in a)WSH.echo(a[b]);
复制代码

TOP

多谢pcl_test帮忙,可以把Excel并列合并了,但是合并后里面的内容全部混合在一起,无法分清原来的文件内容,并且中间也没有空格分开

TOP

本帖最后由 pcl_test 于 2016-10-14 01:18 编辑

回复 7# 司马光2008

你用什么软件打开的csv文件?空格还是空一列?
  1. a[i]+=' '+txt[i]
复制代码
改为
  1. a[i]+=',,'+txt[i]
复制代码
用Excel打开,空一列
1

评分人数

TOP

http://batch-cn.qiniudn.com/tool/2.1/paste.exe
  1. paste -d" " *.csv > merge.csv
复制代码

TOP

感谢pcl_test和各位的帮忙,已经可以了,再次感谢

TOP

回复 6# pcl_test


您好,打扰了!
我要合并的csv行数不一样,合并后出现了一点错乱,还是用楼主的例子:
第一个文件:     第二个文件:     结果合并成了:
AB                 CDF                 AB CDF
12                 345                 12 345
                     678                 678
请问代码该如何调整?谢谢了!

TOP

回复 11# huangfei3777

你都没说你想要的结果是什么,怎么调整?

TOP

回复 12# pcl_test

抱歉,是我没说清楚,目标是这样的:
    AB CDF
    12 345
         678

TOP

回复 13# huangfei3777
  1. /*&cls&echo off
  2. del "$合并结果.csv" 2>nul
  3. dir /a-d/b *.csv|cscript -nologo -e:jscript "%~f0">"$.tmp"
  4. ren "$.tmp" "$合并结果.csv"
  5. pause&exit
  6. */
  7. var fso = new ActiveXObject('Scripting.FileSystemObject'), a=[], b=[], n=0, m=1, max=0, s='';
  8. for(var i=0;i<5000;i++)s+=',';
  9. while(!WSH.StdIn.AtEndOfStream){
  10.     var line = WSH.StdIn.ReadLine();
  11.     var f = fso.OpenTextFile(line, 1);
  12.     try{
  13.         var txt = f.ReadAll().split(/[\r\n]+/);
  14.         f.Close();if(txt.length>=max)max=txt.length;
  15.         for(var i=0;i<txt.length;i++){
  16.             if(!/"/.test(txt[i])){
  17.                 b[m]=txt[i].split(',').length;
  18.                 n+=b[m];break;
  19.             }
  20.         }
  21.         for(var i=0;i<max;i++){
  22.             if(a[i]){
  23.                 if(i<txt.length){
  24.                     a[i]+=','+txt[i];
  25.                 }else {a[i]+=s.substr(0, b[m]);}
  26.             }else{
  27.                 if(m==1){
  28.                     a[i]=txt[i];  
  29.                 }else a[i]=s.substr(0, n-b[m])+txt[i];
  30.             }
  31.         }
  32.         m++;
  33.     }catch(e){}
  34. }
  35. for(var b in a)WSH.echo(a[b]);
复制代码

TOP

感谢pcl_test大神的大力支持!

TOP

返回列表