找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 37462|回复: 14

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

[复制链接]
发表于 2016-10-13 00:07:10 | 显示全部楼层 |阅读模式
本帖最后由 司马光2008 于 2016-10-14 01:04 编辑

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

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

合并到一个EXCEL中
AB CDF
12 345
 楼主| 发表于 2016-10-13 00:09:04 | 显示全部楼层
请各位多多帮忙
 楼主| 发表于 2016-10-13 00:12:58 | 显示全部楼层
使用下面的方式可以合并,但是只能首尾合并,不能并列合并

@echo off
E:
cd xls
dir
copy *.csv all_keywords.csv
echo @@@@@@@@@@@@@合并成功!@@@@@@@@@@@@@'
pause
*****************************
发表于 2016-10-13 02:25:30 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
codegay + 1 1

查看全部评分

 楼主| 发表于 2016-10-13 21:55:26 | 显示全部楼层
谢谢 DiamondbacK的回复,但是我只懂一点点批处理
发表于 2016-10-14 00:07:39 | 显示全部楼层
本帖最后由 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]);
复制代码
 楼主| 发表于 2016-10-14 01:08:14 | 显示全部楼层
多谢pcl_test帮忙,可以把Excel并列合并了,但是合并后里面的内容全部混合在一起,无法分清原来的文件内容,并且中间也没有空格分开
发表于 2016-10-14 01:14:41 | 显示全部楼层
本帖最后由 pcl_test 于 2016-10-14 01:18 编辑

回复 7# 司马光2008

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

评分

参与人数 1技术 +1 收起 理由
司马光2008 + 1 感谢分享

查看全部评分

发表于 2016-10-14 01:37:49 | 显示全部楼层
http://batch-cn.qiniudn.com/tool/2.1/paste.exe
  1. paste -d" " *.csv > merge.csv
复制代码
 楼主| 发表于 2016-10-14 18:57:41 | 显示全部楼层
感谢pcl_test和各位的帮忙,已经可以了,再次感谢
发表于 2016-11-22 11:02:14 | 显示全部楼层
回复 6# pcl_test


您好,打扰了!
我要合并的csv行数不一样,合并后出现了一点错乱,还是用楼主的例子:
第一个文件:     第二个文件:     结果合并成了:
AB                 CDF                 AB CDF
12                 345                 12 345
                     678                 678
请问代码该如何调整?谢谢了!
发表于 2016-11-22 11:07:20 | 显示全部楼层
回复 11# huangfei3777

你都没说你想要的结果是什么,怎么调整?
发表于 2016-11-22 11:13:34 | 显示全部楼层
回复 12# pcl_test

抱歉,是我没说清楚,目标是这样的:
    AB CDF
    12 345
         678
发表于 2016-11-22 17:22:28 | 显示全部楼层
回复 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]);
复制代码
发表于 2016-11-23 17:50:26 | 显示全部楼层
感谢pcl_test大神的大力支持!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 15:07 , Processed in 0.024553 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表