2017-02-28 9 views
0

このコードは以前のスタックオーバーフロースレッドのスピンオフだったWebサイトで見ましたが、バッチを利用しようとしています。私はバッチでほとんど仕事をしていませんでしたが、希望の最終結果が得られるように見えますが、私が好きなものをやっていない、どんな助けでも大歓迎です。コードの下に、私が達成しようとしていることの例を載せました。バッチファイル複数のファイルのテキストを1つのCSVに結合

@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 
+0

「自分のコラム」とはどういう意味ですか? 10列のファイルがそれぞれ3つあり、出力ファイルに30列が含まれているとしますか?例を投稿してください –

+0

各テキストファイルは1つの列です。基本的にこれらのファイルをまとめて出力ファイルが3列になるようにします。 – grant8989

答えて

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として行番号をtokenising、使用される最大行数を算出含むファイルです。

次のセクションでは、行番号を%%Lに数えて、tempfileの一致する行番号からlineを作成します。 tempfileにはファイル指定の順番でnという行が含まれているので、各行nを選択してそれらを一緒にストリングすると、指定された行が作成されます。

最後のファイルを除いて、各行に端末,があるあなたのデータは投稿されているとは思われます。私はこの,が見つからないと考えており、この手順では区切り文字として,を挿入することが予想されます。その後、

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

カンマを挿入するために、echoラインバーの最初の文字のすべて:

これがそうであれば、必要な変更です。

+0

最後のファイルにはaが含まれていませんが、ファイルの最後の行ですが、これは私が必要としていたものです。ご回答いただきありがとうございました。 – grant8989

+0

新しく作成されたファイルの最後の行が 11111111111111111:2222222222222222,2222222222222221:3333333333333333,3333333333333333のように印刷されますか? – grant8989

+0

いいえ、あなたのファイルは1行で '111 'と推測しています。 #2: '222 '、各行には#3:' 333'があります。入力の最後の行について珍しいことはありますか? 3つのファイルはすべて同じ行数ですか?完璧に私のために働いた... – Magoo

0

この方法では、1つのファイルの行数が他のファイル数よりも少ない場合に行を調整し、ファイルごとに直接マージファイルを実行します。

@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 
関連する問題