批处理文件将csv中的字符串替换为另一个文件中的列表

时间:2016-10-26 16:07:03

标签: csv batch-file replace

我需要借助另一个文件中的列表替换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;
...

我用来替换第3列的另一个文件( Mitarbeiter.csv )如下所示:

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,因为我得到了这个结果:

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并用40200替换它,然后在下一个循环中它找到40200中的200并用40226替换它,与40201中的107和201相同。因为<1中没有数字202 em> Mitarbeiter.csv ,108被40202正确替换。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

在问题中最终会有什么偏好:可读性与执行时间与内存消耗等等。