首页 > 解决方案 > 使用批处理文件有条件地替换 csv 中的值

问题描述

此批处理文件旨在根据第 17 列(发布者)中的值更新 csv 文件的第 8 列(部门)。批处理文件运行 - 并且不产生错误消息 - 但输出文件与输入文件完全相同 - 第 8 列未更新。我已经查看了我之前问题的答案,搜索了许多教程,并研究了其他 stackoverflow 问题。这是我的问题:(1)if语句检查第17列值的正确语法是什么,(2)在循环(for / 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    

标签: csvbatch-fileconditional

解决方案


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 offandecho 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如果脚本最终被另一个脚本调用,如果由于脚本失败而错过了 an ,您将不会得到难以理解的 spew 结果。


推荐阅读