合并多个csv文件并排使用批处理文件

8yoxcaq7  于 2023-09-28  发布在  其他
关注(0)|答案(3)|浏览(138)

我正在寻找两个合并成一个多个csv文件。然而,我需要他们合并,使列并排不继续。我的文件每次有两列,我会有一个csv文件,通过提取每个文件上的第二列并复制到另一个文件中,所以我将有一个x列的文件(第二个)。
例如
File1

A B
1 2
1 2
1 2

File2

A C
1 3
1 3
1 3

Filex

A X
1 x
1 x
1 x

结果

B C X
2 3 x
2 3 x
2 3 x

我发现了这个:Merge csv file side by side using batch file
但它只针对两个文件,并不提取任何内容。
谢谢.

b09cbbtk

b09cbbtk1#

下面的所有解决方案都假设所有输入文件的格式一致,并且具有相同的行数。
Merge csv file side by side using batch file中使用的技术可以修改为解析和支持2个以上的文件。我还在循环中打开和关闭延迟扩展,以保护可能出现在数据中的任何!。如果在启用延迟扩展时扩展包含!的FOR变量,则这些变量将损坏:

@echo off
setlocal disableDelayedExpansion
3<"test2.txt" 4<"test3.txt" (
  for /f "usebackq tokens=2 delims= " %%A in ("test1.txt") do (
    set "A=%%A"
    set /p "B=" <&3
    set /p "C=" <&4
    setlocal enableDelayedExpansion
    echo !A! !B:* =! !C:* =!
    endlocal
  )
) >"result.txt"

上面的代码可以通过FOR循环加上句柄0和3-9扩展到最多支持9个输入文件。如果你有超过8个输入,那么你需要多个循环。第一个循环可以处理前9个文件并将部分结果写入临时文件。连续循环可以从临时文件读取并合并多达8个附加文件。
如果解析规则变得更加复杂,上述操作可能会变得很麻烦。
我的JREPL.BAT hybrid JScript/batch utility可以用来高效地解析和合并任意数量的文件,并且您可以根据需要修改正则表达式来解析几乎任何csv文件格式。

@echo off
setlocal
set "merge=jrepl ".*( .*)" "stdin.ReadLine()+$1" /j /f"
jrepl ".* (.*)" "$1" /f test1.txt | %merge% test2.txt | %merge% test3.txt >result.txt

理论上,您可以使用任意数量的管道来支持所有的输入文件,但是如果管道太多,可能会变得低效。您可以使用临时文件来暂存合并以保持效率。

ktecyv1j

ktecyv1j2#

本文最初描述的方法可以修改,以处理可变数量的文件(最大8个),因此您只需将所需的文件放入参数中:

@echo off
setlocal DisableDelayedExpansion

rem MergeFiles.bat: Merge several files horizontally
rem Antonio Perez Ayala

rem Process files in the arguments and 
rem assemble the lists of redirections and SET /P commands
set file1=%1
set "redirs="
set "commands="
set n=2
:nextFile
   shift
   if "%~1" equ "" goto endFiles
   set /A n+=1
   set "redirs=%redirs% %n%<%1"
   set "commands=%commands% & set /P "part=!part:* =! " <&%n%"
goto nextFile
:endFiles

rem First file is read with FOR /F command
rem The rest of files are read via standard handles, starting at # 3

%redirs% (
   for /F "usebackq delims=" %%a in (%file1%) do (
      rem Get first part from first file
      set "part=%%a"
      rem Output parts from all files, excepting the last one
      setlocal EnableDelayedExpansion
      %commands:~3%
      rem Output part from last file
      echo !part:* =!
      endlocal
   )
) > result.txt

举例来说:

C:\> type file?.txt

file1.txt

A B
1 2
1 2
1 2

file2.txt

A C
1 3
1 3
1 3

fileX.txt

A X
1 x
1 x
1 x

fileY.txt

A Y
1 y
1 y
1 y

C:\> MergeFiles.bat file1.txt file2.txt fileX.txt fileY.txt

C:\> type result.txt
B C X Y
2 3 x y
2 3 x y
2 3 x y
nzrxty8p

nzrxty8p3#

@ECHO OFF
SETLOCAL enabledelayedexpansion
:: remove variables starting $
FOR  /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a="
SET /a $count=0
FOR %%a IN (q28850167*.txt) DO (
 FOR  /f "tokens=1,2*delims=: " %%b IN ('findstr /n /r "^" "%%a"') DO (
  SET $%%b=!$%%b! %%d
  IF !$count! LSS %%b SET /a $count=%%b
 )
)
(
FOR /L %%a IN (1,1,%$count%) DO ECHO(!$%%a:~1!
)>newfile.txt

GOTO :EOF

我使用名为q28850167*.txt的文件来进行测试,其中包含您的数据。
生成newfile.txt
清除从$开始的所有变量
对于匹配掩码的每个文件,通过findstr/n处理每行,以将number :应用于每行的开头。使用:和Space作为分隔符选择第一列和第三列+,并附加到变量$linenumber
然后简单地从存储的数据中再现每一行。

相关问题