2017-07-14 14 views
1

申し訳ありませんが、Windowsのバッチがうまくいかないです。Windowsバッチのデータと一致するデータファイルをマージする方法

2つ以上のファイルをキー値で一致させてマージします。これらのファイルには、行番号が異なります。例えば

File_A.txt

Time, D1, D2 
1.1, 11, 12 
1.2, 21, 22 
1.3, 31, 32 
1.4, 41, 42 
1.5, 51, 52 

File_B.txt

Time, D3, D4 
1.1, 13, 14 
1.3, 33, 34 
1.4, 43, 44 

File_C.txt

Time, D5, D6 
1.2, 25, 26 
1.4, 45, 46 
1.5, 55, 56 

は私が取得したい:

Merged.txt

Time, D1, D2, D3, D4, D5, D6 
1.1, 11, 12, 13, 14 
1.2, 21, 22, , , 25, 26 
1.3, 31, 32, 33, 34 
1.4, 41, 42, 43, 44, 45, 46 
1.5, 51, 52, , , 55, 56 

私はC/C++でそれを作る場合は、それが簡単になりますが、理由は私の状況で、私は、Windowsのバッチでそれをしなければならない、と私は私が持っているかimagenateすることはできませんする。

ご了承ください。

+2

あなたはいくつかの研究を行うと、自分でそれをしようとする必要があります。

@echo off setlocal EnableDelayedExpansion set "keys=" for %%f in (File_*.txt) do ( if not defined keys ( for /F "usebackq tokens=1* delims=," %%a in ("%%f") do ( set "line[%%a]=%%a,%%b" set "keys=!keys! %%a" ) ) else ( set "rest=!keys!" for /F "usebackq tokens=1* delims=," %%a in ("%%f") do ( set "line[%%a]=!line[%%a]!,%%b" set "rest=!rest: %%a=!" ) for %%k in (!rest!) do set "line[%%k]=!line[%%k]!, , " ) ) (for %%k in (%keys%) do echo !line[%%k]!) > Merged.txt 

入力として、あなたの3つのサンプルファイルを使用して、これが出力されます。さもなければ、この質問はコード/スクリプト要求であるように思われます。 [ツアー]を読んで[尋ねる]をお読みください! – aschipfl

+0

'File_A.txt'は常に全ての' Time'値を含んでいますか? – aschipfl

+0

申し訳ありませんが、サー。私も自分自身で検索せずに何かを尋ねるのは好きではない、 実際には数時間前に検索したが、私に合った答えを見つけることができず、あまり長いコードを作ることもできない。 はい、File_A.txtには、Timeのすべての値が含まれています。 – Hong

答えて

1

この溶液プロセスカレントディレクトリにFile_*.txtという名前のすべてのファイルと「マスターファイル」(すべてのキーを持つ1)は最初のファイルであることを前提としています。

Time, D1, D2, D3, D4, D5, D6 
1.1, 11, 12, 13, 14, , 
1.2, 21, 22, , , 25, 26 
1.3, 31, 32, 33, 34, , 
1.4, 41, 42, 43, 44, 45, 46 
1.5, 51, 52, , , 55, 56 
0

大容量ファイルではあまり効率的ではありませんが、これはバッチスクリプトです。これは、すべてのファイルが同じ数のカラム(私たちの状況では3つ)を持ち、最初のファイルが最初のカラムにすべての値を持つことに依存しています。

merge.bat "File_A.txt" "File_B.txt" "File_C.txt" 

結果ファイルは、常に現在の作業ディレクトリにMerged.txt次のようになります。スクリプトはmerge.batとして保存されていると仮定すると、あなたは次のように、コマンドライン引数としてマージするファイルを提供する必要があります。だからここのコードです:入力として、あなたのサンプルファイルと

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_SEPAR=, " 
set "_FILL=%_SEPAR% %_SEPAR% " 
set "_RESULT=Merged.txt" 

set "FIRST=#" 
for %%A in (%*) do (
    if defined FIRST (
     > nul copy /Y "%%~nxA" "%_RESULT%" 
     set "FIRST=" 
    ) else (
     > "%_RESULT%.tmp" (
      for /F usebackq^ delims^=^ eol^= %%F in ("%_RESULT%") do (
       set "FLAG=" & set "LINE=%%F" 
       for /F usebackq^ delims^=^ eol^= %%I in ("%%~A") do (
        for /F "eol=%_SEPAR:~,1% delims=%_SEPAR%" %%E in ("%%F") do (
         for /F "tokens=1* eol=%_SEPAR:~,1% delims=%_SEPAR%" %%J in ("%%I") do (
          if "%%E"=="%%J" set "STR=%%K" & set "FLAG=#" 
         ) 
        ) 
       ) 
       setlocal EnableDelayedExpansion 
       if defined FLAG (
        echo(!LINE!%_SEPAR%!STR! 
       ) else (
        echo(!LINE!%_FILL% 
       ) 
       endlocal 
      ) 
     ) 
     > nul move /Y "%_RESULT%.tmp" "%_RESULT%" 
    ) 
) 

endlocal 
exit /B 

は、Merged.txtでの出力は、このことになるだろう。ここで

Time, D1, D2, D3, D4, D5, D6 
1.1, 11, 12, 13, 14, , 
1.2, 21, 22, , , 25, 26 
1.3, 31, 32, 33, 34, , 
1.4, 41, 42, 43, 44, 45, 46 
1.5, 51, 52, , , 55, 56 

代替バッチスクリプトです。他のファイルとは対照的に、最初のファイルは、最初の列にすべての可能な値を含むことはもはや予想されません。これはコードです:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_SEPAR=, " 
set "_FILL=%_SEPAR% %_SEPAR% " 
set "_RESULT=Merged.txt" 

for /F "delims==" %%E in ('set "$" 2^> nul') do set "%%E=" 
set /A "INDEX=0" 
for %%A in (%*) do (
    for /F "usebackq eol=%_SEPAR:~,1% delims=%_SEPAR%" %%E in ("%%~A") do (
     call set "NUMBER=000000000000%%INDEX%%" 
     if not defined $[%%E] call set "$[%%E]=%%NUMBER:~-12%%%_SEPAR%%%E" 
     set /A "INDEX+=1" 
    ) 
) 
> "%_RESULT%.tmp" (
    for /F "tokens=1* delims==" %%E in ('set "$"') do @(
     echo(%%F 
    ) 
) 
> "%_RESULT%" (
    for /F "tokens=1* delims=%_SEPAR%" %%E in ('sort "%_RESULT%.tmp"') do @(
     echo(%%F 
    ) 
) 
del "%_RESULT%.tmp" 
for %%A in (%*) do (
    > "%_RESULT%.tmp" (
     for /F usebackq^ delims^=^ eol^= %%F in ("%_RESULT%") do (
      set "FLAG=" & set "LINE=%%F" 
      for /F usebackq^ delims^=^ eol^= %%I in ("%%~A") do (
       for /F "eol=%_SEPAR:~,1% delims=%_SEPAR%" %%E in ("%%F") do (
        for /F "tokens=1* eol=%_SEPAR:~,1% delims=%_SEPAR%" %%J in ("%%I") do (
         if "%%E"=="%%J" set "STR=%%K" & set "FLAG=#" 
        ) 
       ) 
      ) 
      setlocal EnableDelayedExpansion 
      if defined FLAG (
       echo(!LINE!%_SEPAR%!STR! 
      ) else (
       echo(!LINE!%_FILL% 
      ) 
      endlocal 
     ) 
    ) 
    > nul move /Y "%_RESULT%.tmp" "%_RESULT%" 
) 

endlocal 
exit /B 
関連する問題