2016-10-26 14 views
0

csv-columnの数字を別のファイルのリストの助けによって置き換える必要があります。私はちょうどバッチ処理について学び始め、自分のニーズに合わせたスクリプトを見つけました。バッチファイルcsvの文字列を別のファイルのリストと置き換えます

これは私がちょうど、3番目の列を取る番号を交換し、新しいファイルに古いものと新しいものを書き、私が使用して、最初にこの問題を解決するためのコードです:古いを

@echo off & setlocal enabledelayedexpansion 

set "Datei=lohn_prod.csv" 
set "MA=Mitarbeiter.csv" 
set "Ziel=eGecko.csv" 

set "t=%temp%\text.tmp" 
if exist "%t%" del "%t%" 
for /f "tokens=3 delims=;" %%i in ('findstr /n $ "%Datei%"') do set "Line=%%i" & call :ProcessLine 
move "%t%" "%Ziel%" 
goto :eof 

:ProcessLine 
for /f "tokens=1 delims=" %%i in ("%Line%") do set "L=%%i" 
if not defined L >>"%t%" echo\& goto :eof 
echo %L% 
for /f "usebackq tokens=1,2 delims=;" %%i in ("%MA%") do set "L=!L:%%i=%%j!" 
>>"%t%" echo %Line%, %L% 
goto :eof 

CSV(lohn_prod.csv)は次のようになります。

15;01.09.2016;105;160,25;1;2100;210; 
15;01.09.2016;105;40;1;;217; 
15;01.09.2016;105;5;72;;; 
15;01.09.2016;107;184;1;2213;210; 
15;01.09.2016;107;7,25;1;;213; 
15;01.09.2016;107;16;1;;216; 
15;01.09.2016;108;241,25;1;3200;210; 
15;01.09.2016;108;21,25;1;;222; 
15;01.09.2016;113;174,75;1;2111;210; 
15;01.09.2016;113;16;1;;216; 
... 

他のファイル(Mitarbeiter.csv)私は3番目の列を置き換えるために使用するには、次のようになります。

それはそうと

105, 4040226 
105, 4040226 
105, 4040226 
107, 4040227 
107, 4040227 
107, 4040227 
108, 40202 
108, 40202 
113, 40203 
113, 40203 
115, 40204 
170, 40219 
170, 40219 
172, 4040228 
172, 4040228 
172, 4040228 
185, 40221 
185, 40221 
185, 40221 
... 

、それは最初の105を検索し、それを置き換える:

105;40200 
107;40201 
108;40202 
113;40203 
115;40204 
170;40219 
172;40220 
195;40222 
197;40223 
198;40224 
199;40225 
200;40226 
201;40227 
220;40228 
235;40229 
240;40230 
... 

問題は、しかし、私がこのような結果を得るために、各ループの最初から再びLを反復処理するようだということであり、 40200とし、次のループで40200の200を見つけ、それを40206の107と201と同じ40226に置き換えます。に番号202がないので、Mitarbeiter.csvに108が正しく置き換えられます。

答えて

1

これを行う必要があります:

@Echo Off 
(Set Datei=lohn_prod.csv) 
(Set MA=Mitarbeiter.csv) 
(Set Ziel=eGecko.csv) 
For /F "Tokens=1-2 Delims=;" %%A In ('FindStr "[0-9]*;.*" "%MA%"') Do (
    If Not Defined $[%%A] Set "$[%%A]=%%B") 
(For /F "UseBackQ EOL=; Tokens=1-3* Delims=;" %%A In ("%Datei%") Do (
    Call Echo=%%A;%%B;%%$[%%C]%%;%%D))>%Ziel% 
Exit/B 
+0

すごい[OK]を、それは魔法のように動作し、そうですはるかに短く、明日のコードを勉強しなければならない、ありがとう! –

+0

Mitarbeiter.csvが可能なすべての3番目の列項目を保持していない場合、eGecko.csvの3番目の列には必要なものが含まれていないというわずかな警告です。 – Compo

+0

私は今あなたのコードを理解したと思う、あなたは$ [%% A] = %% B、素晴らしい解決策を使って(Pythonの言葉で)辞書を作った!そして、情報をありがとう、私はとにかくそれをfoolsproofにする必要がありますので、私は不足アイテムのチェックを入れて、その場合は警告を出すことができるかどうかを確認します。 –

0

あなたのアプローチは完全に間違っていなかったし、冗長性/脆弱性が削除されてもそれほど長くはありません。

好むものを疑問に絶頂に達する
@echo off 
set "Datei=lohn_prod.csv" 
set "MA=Mitarbeiter.csv" 
set "Ziel=eGecko.csv" 
Type NUL > "%Ziel%" 
for /f "tokens=1-3* delims=;" %%A in ('Type "%Datei%"' 
) do call :ProcessLine %%A %%B %%C "%%D%" 
goto :eof 
:ProcessLine 
for /f "tokens=2 delims=;" %%i in ('Findstr /B "%3;" %MA%' 
) do >>"%Ziel%" echo %1;%2;%%i;%~4 
goto :eof 

コールも排除することができる

@echo off 
set "Datei=lohn_prod.csv" 
set "MA=Mitarbeiter.csv" 
set "Ziel=eGecko.csv" 
Type NUL > "%Ziel%" 
for /f "tokens=1-3* delims=;" %%A in ('Type "%Datei%"' 
) do for /f "tokens=2 delims=;" %%i in ('Findstr /B "%%C;" %MA%' 
) do >>"%Ziel%" echo %%A;%%B;%%i;%%D 

:読みやすさをExecutionTimeが対などmemoryconsumption対

+0

このソリューションをお寄せいただきありがとうございます。私はどこかでお読みになり、別のカプセル化されたforループでforループの変数を使用できないため、そのアプローチを試してみるのに時間を浪費しませんでした。私が間違っていたことを知りました。私はexectiontimeのために他の解決策を使用し、それは私が上に投稿していなかったcsvインタクトのヘッダーを保持します。 –

+0

@Thorka MAeは、eGecko.csvのレコーダーの中にSpalte MitarbeiterNummerを挿入しました。 – LotPings

+0

Ich weiss、das ist auch das Ziel。ディーンストレイスター、デイシング・シアター・シアター、デイジー・カンザス・シアターなどがあります。 –

関連する問題