Board logo

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

作者: 司马光2008    时间: 2016-10-13 00:07     标题: 如何把多个EXCEL或者CSV文件行行对应合并到一个EXCEL中

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

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

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

合并到一个EXCEL中
AB CDF
12 345
作者: 司马光2008    时间: 2016-10-13 00:09

请各位多多帮忙
作者: 司马光2008    时间: 2016-10-13 00:12

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

@echo off
E:
cd xls
dir
copy *.csv all_keywords.csv
echo @@@@@@@@@@@@@合并成功!@@@@@@@@@@@@@'
pause
*****************************
作者: DiamondbacK    时间: 2016-10-13 02:25

本帖最后由 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 代。
作者: 司马光2008    时间: 2016-10-13 21:55

谢谢 DiamondbacK的回复,但是我只懂一点点批处理
作者: pcl_test    时间: 2016-10-14 00:07

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

作者: 司马光2008    时间: 2016-10-14 01:08

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

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

回复 7# 司马光2008

你用什么软件打开的csv文件?空格还是空一列?
  1. a[i]+=' '+txt[i]
复制代码
改为
  1. a[i]+=',,'+txt[i]
复制代码
用Excel打开,空一列
作者: Bella    时间: 2016-10-14 01:37

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

作者: 司马光2008    时间: 2016-10-14 18:57

感谢pcl_test和各位的帮忙,已经可以了,再次感谢
作者: huangfei3777    时间: 2016-11-22 11:02

回复 6# pcl_test


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

回复 11# huangfei3777

你都没说你想要的结果是什么,怎么调整?
作者: huangfei3777    时间: 2016-11-22 11:13

回复 12# pcl_test

抱歉,是我没说清楚,目标是这样的:
    AB CDF
    12 345
         678
作者: pcl_test    时间: 2016-11-22 17:22

回复 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]);
复制代码

作者: huangfei3777    时间: 2016-11-23 17:50

感谢pcl_test大神的大力支持!




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2