使用批处理文件有条件地替换csv中的值

时间:2018-12-29 19:26:13

标签: csv batch-file conditional

此批处理文件旨在根据列17(发布者)中的值更新csv文件的列8(部门)。批处理文件运行-不会产生错误消息-但输出文件与输入文件完全相同-第8列未更新。我已经审查了我以前的问题的答案,搜索了许多教程,还研究了其他stackoverflow问题。这是我的问题:(1)if语句检查第17列的值的正确语法是什么;(2)在循环(对于/ f)命令中为第8列设置变量的正确语法是什么?

@echo off
setlocal EnableDelayedExpansion

rem | Move Manga to Manga Department

for /f "tokens=1-17,* delims=," %%A in (file.csv) do (
    set "department=%%H"
    set "publisher=%%Q"
    if "!department!"=="3" (

        if "!publisher!"=="YEN PRESS" (

        set "%%H=1010"

        )

    )

>>file_14.csv echo %%A,%%B,%%C,%%D,%%E,%%F,%%G,%%H,%%I,%%J,%%K,%%L,%%M,%%N,%%O,%%P,%%Q,%%R

)

@echo on

1,"MAY090178","D ","BATMAN HUSH COMPLETE TP (C: 1-1-0)",24.99,11.2455,11.25,3,7,         ,62464962,"76194127923700111","1401223176","978140122317552499","                    ",0,"DC COMICS",000000
1,"NOV141747","F ","BLACK BUTLER GN VOL 19 (C: 1-1-0)",13.00,7.5400,7.54,3,7,         ,62464962,"","0316259403","978031625940851300","                    ",0,"YEN PRESS",127143
2,"MAY151682","F ","BLACK BUTLER GN VOL 20 (C: 1-1-0)",13.00,7.5400,15.08,3,7,         ,62464962,"","0316305014","978031630501351300","                    ",0,"YEN PRESS",127143    

1 个答案:

答案 0 :(得分:1)

set命令需要varname = value。您正在使用从文件读取的%% H的内容,并尝试通过该名称设置局部变量。试试:

set department=1010

然后:

>>file_14.csv echo %%A,%%B,%%C,%%D,%%E,%%F,%%G,!department!,%%I,%%J,%%K,%%L,%%M,%%N,%%O,%%P,%%Q,%%R

我确实认为我在那里发现了一个错误的错误。验证结果是否正确。如果将更多字段添加到csv文件中,您的tokens=1-17,*稍后可能会咬您。 “ tokens = 1-18,*”对我来说更有意义。如果第18栏没有其他内容,我认为这对您来说并不重要,因此您最好还是对脚本进行过时验证。

除上述内容外,我将摆脱@echo offecho on行,或者将@setlocal ...语句放在脚本顶部。您不应该这样嘲笑用户环境。参见help setlocal。您始终可以在每个脚本命令的前面放置@符号,以避免显示该特定命令。脚本开头的@echo off存在的问题是它很粘。如果脚本在某处失败,则回显标志的状态为最后设置的状态。这使得其中包含此类命令的脚本无法使用。

当每个命令前面带有@符号时,调试脚本会更容易:

@setlocal EnableDelayedExpansion

@rem | Move Manga to Manga Department

@for /f "tokens=1-17,* delims=," %%A in (file.csv) do (
    @set "department=%%H"
    @set "publisher=%%Q"
    @if "!department!"=="3" (
        @if "!publisher!"=="XYZ" (
        @set "department=1010"
        )
    )
    >>file_14.csv @echo %%A,%%B,%%C,%%D,%%E,%%F,%%G,!department!,%%I,%%J,%%K,%%L,%%M,%%N,%%O,%%P,%%Q,%%R
)

通过这种方式,在调试时,您可以删除相关的@或两个,而不必通读整个spew。如果该脚本最终被另一个脚本调用,那么如果由于脚本失败而错过了echo off/on,您将不会得到难以理解的喷出结果。

相关问题