首页 > 解决方案 > 用批处理替换 csv 文件中的列值

问题描述

我有一个逗号分隔的 csv 文件,如下所示:

ID,USER_ID, COL3_STR, COL4_INT
id1,username1,exampleA, 5
id2,username1,exampleB,0
id3,username2,NULL,-1
id4,username3,,3,false,20

第 2 列 USER_ID 中的每个值都必须替换为testusername(标题“USER_ID”除外)。值不同,因此我无法搜索已定义的字符串。

我的想法是使用 for 循环并从每一行获取第二个令牌以获取用户名。例如:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET currentDir=%~dp0
SET "srcfile=%currentDir%\inputfile.csv"
SET "outfile=%currentDir%\result.csv"

for /f "tokens=2 delims=," %%A IN (%srcfile%) DO (
    ECHO %%A)

ECHO done
PAUSE

输出:

USER_ID
username1
username1
username2
username3

因此(新)csv 文件的第二列必须如下所示:

USER_ID
testusername
testusername
testusername
testusername

我看到另一个问题的答案很有帮助。示例:当每个用户名都是“admin”时:

(
  for /f "delims=" %%A in (%srcfile%) do (
    set "line=%%A"
    for /f "tokens=2 delims=," %%B in ("admin") do set "line=!line:%%B=testuser!"
    echo !line!
  )
)>%outfile%

但这仅适用于已定义的字符串。这是我的第一个批处理脚本,我不知道如何根据我的情况“组合”它。我希望有人能帮助我。必须适用于 Windows 7 和 10。

标签: csvbatch-file

解决方案


您需要所有令牌(用于编写修改后的文件),而不仅仅是第二个:

for /f "tokens=1,2,* delims=," %%A in (%srcfile%) do echo %%A,testuser,%%C

(其中*“行的其余部分,未定界”)。%%B将是用户名,因此只需编写替换字符串。

您可以使用if语句以不同方式处理第一行,或者单独处理它:

<"%srcfile%" set /p header=
(
    echo %header%
    for /f "skip=1 tokens=1,2,* delims=," %%A in (%srcfile%) do echo %%A,testuser,%%C
) > "%outfile%"

推荐阅读