如何将多个CSV文件合并为一个?

x33g5p2x  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(282)

我有15个CSV文件,我必须合并成一个。我试图从Windows命令行复制,但这将它加入到一个单一的列。我正在寻找的是,每个CSV是一个列内的合并文件:

D1.csv   D2.csv   D3.csv
11       21       31
12       22       32
13       23       33

然后道:

Copy *.csv combined.csv

结果:

11
12
13
21
22
23
31
32
33

预期结果:

11 21 31
12 22 32
13 23 33
2w2cym1i

2w2cym1i1#

@ECHO OFF
SETLOCAL enabledelayedexpansion
SET "sourcedir=c:\testso\sourcedir"
SET "destdir=c:\testso\destdir"
SET "outfile=%destdir%\outfile.txt"

:: remove variables starting #
FOR  /F "delims==" %%a In ('set # 2^>Nul') DO SET "%%a="

FOR /f "delims=" %%e IN (
 'dir /b /a-d "%sourcedir%\*.csv" '
 ) DO (
 rem one more file found
 set /a #line=10000
 for /f "usebackqdelims=" %%y in ("%sourcedir%\%%e") do (
  set /a #line+=1
  for %%o in (!#line!) do set "#data%%o=!#data%%o! %%y"
 )
)
(
 for /f "tokens=1*delims== " %%b in ('set #data') do echo %%c
)>"%outfile%"

GOTO :EOF

代码的第一部分设置要使用的目录和输出文件名。改得适合自己
接下来,从环境中删除启动#的所有变量。
然后在source目录中找到所有的.csv文件,当然,你可以修改文件掩码*来适应。
找到每个文件名后,启动一个计数器。我使用了一个大的数字,这样数据将到达变量#data10001,等等。
读取%%e中当前文件的每一行。由于delims=usebackq是必需的,因此需要整行内容,因为文件名用引号括起来。
对于每一行,通过首先将当前行号放置在x1M7N1x中以利用x1M8N1x的解析方法,来转移行号并将行内容附加到#datathelinenumber
最后,从文件中读取的所有数据都将存放在#data10001#data10002中,因此使用set来按顺序列出数据,并选择set输出在=和空格之后。
请注意,这要求所有文件都具有相同的行数,并且所有行都包含一些数据。
列的顺序与dir命令列出的文件的顺序相同。

91zkwejq

91zkwejq2#

这个问题的正确解决方案很大程度上取决于结果文件的 * 总大小 * 和 * 最长行的大小 *。如果文件总大小很小,那么Magoo's solution应该能很好地工作。但是,如果文件很大,那么这样的解决方案就会很慢...
如果结果文件很大,则此解决方案应该更快:

@echo off
setlocal EnableDelayedExpansion

del combined.out

for %%f in (*.csv) do (

   if not exist combined.out (
      copy %%f combined.out
   ) else (
      < %%f (
         for /F "delims=" %%a in (combined.out) do (
            set /P "line="
            echo %%a !line!
         )
      ) > combined.new
      del combined.out
      ren combined.new combined.out
   )

)
ren combined.out combined.csv

但是,如果最长线的大小大于1023,则无法使用此解决方案

tag5nh1u

tag5nh1u3#

我不是100%确定你的全部要求是什么,有标题或没有,但这里有一些想法。

type *.csv>combined.tmp && ren combined.tmp combined.csv

它会将文件夹根目录中的所有.csv文件合并到combined.csv
或者删除合并文件中所有其他文件的头:

for %%i in (*.csv) do if not "%%~i" == "combined.csv more +1 "%%~i">>combined.csv

相关问题