批处理文件将来自多个文件的文本合并为一个csv

时间:2017-02-28 04:52:38

标签: batch-file cmd

我在一个网站上看到了这段代码,这是一个先前的堆栈溢出线程,但这正是我试图利用批处理做的事情。我对批处理的工作很少,虽然它看起来应该产生所希望的最终结果,但它并没有做到我想要的,所有的帮助都会非常感激。在代码下面我举了一个我想要完成的例子。

@echo off
set local EnableDelayedExpansion

for %%f in (*.txt) do (
    set i=0
for /F "delims=" %%l in (%%f) do (
    set /A i+=1
    set line!i!=%%l
)
echo %%f, !line1!, !line2!, !line3!, >> result.csv

text file 1    text file 2    text file 3 >> output.csv
1111,          2222,          3333           1111,2222,3333
1111,          2222,          3333           1111,2222,3333
1111,          2222,          3333           1111,2222,3333
1111,          2222,          3333           1111,2222,3333

2 个答案:

答案 0 :(得分:0)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "tempfile=%temp%\tempfile.txt"
SET "outfile=%destdir%\outfile.txt"

(
FOR %%f IN (
 q42500455_0.txt q42500455_1.txt q42500455_2.txt q42500455_3.txt q42500455_4.txt q42500455_5.txt
 ) DO FINDSTR /n /r "." "%sourcedir%\%%f"
)>"%tempfile%"

SET /a maxline=0
FOR /f "usebackqtokens=1delims=:" %%a IN ("%tempfile%") DO IF %%a gtr !maxline! SET /a maxline=%%a

(
FOR /L %%L IN (1,1,%maxline%) DO (
 SET "line="
 FOR /f "usebackqtokens=1*delims=:" %%a IN ("%tempfile%") DO IF %%a==%%L (
  SET "line=!line!%%b"
 )
 ECHO !line!
)
)>"%outfile%"

DEL "%tempfile%" >NUL 2>nul

GOTO :EOF

您需要更改sourcedirdestdir的设置以适合您的具体情况。

我使用名为q42500455*.txt的文件包含您的测试数据。

生成定义为%outfile%

的文件

第一个for循环只是对列表中每个文件的每一行进行编号,并将结果输出到临时文件(其名称无关紧要)。结果是包含

的文件
1:line1 from file1
2:line2 from file1
...
1:line1 from file2
2:line2 from file2
...

下一个for循环只计算使用的最大行号,使用%%a作为分隔符将行号标记为:

下一节将行号计入%%L,然后从临时文件中的匹配行号构建line。由于tempfile按文件指定的顺序包含 n 行,因此挑选每行 n 并将它们串在一起将构建指定的行。

请注意,我怀疑您的数据是已发布的,除最后一个文件外,每行都有终端,。我相信缺少此,,并且该过程应该将,作为分隔符插入。

如果是这样,那么所需的更改是:

...
  SET "line=!line!,%%b"
 )
 ECHO !line:~1!
...

插入逗号,然后echo第一个字符的所有行。

答案 1 :(得分:0)

此方法按文件执行直接合并文件,当一个文件的行数少于其他文件时调整行。

@echo off
setlocal EnableDelayedExpansion

rem Set the current directory where the Batch file is
cd "%~P0"

set "comma="
del result.csv 2>NUL
for %%f in (*.txt) do (

   rem If this is the first file
   if not exist result.csv (
      rem ... just copy it
      copy "%%f" result.csv > NUL

   ) else (

      rem Merge this file with previous one
      set "comma=!comma!,"
      move /Y result.csv result.in > NUL

      rem Read lines of previous file from Stdin
      < result.in (
      rem ... and combine they with this file
      for /F "usebackq delims=" %%l in ("%%f") do (
         set "line=!comma:~1!"
         set /P "line="
         echo !line!,%%l
      )

      rem If previous file is longer than this one, copy the rest of lines
      for /F "delims=" %%l in ('findstr "^"') do echo %%l,

      rem Combine previous output in new result file
      ) > result.csv

   )
)
del result.in