You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写Batch脚本删除CSV第19列值为IN和BR的行

需求说明

有一个包含35列的CSV文件,第19列为国家代码字段,取值包含IN、BR、US等,需要删除该列值为IN和BR的所有数据行。

原有Batch脚本的问题

原脚本存在3个核心问题导致无法正常运行:

  • for /f 命令最多仅支持26个映射token(对应变量%%a到%%z),无法直接覆盖35列的读取需求
  • 过滤逻辑仅判断了BR一个值,未覆盖IN的过滤规则,且if语句存在换行语法错误
  • 逐列手动拼接输出的写法需要枚举全部列变量,维护成本高,极易出现列遗漏、顺序错误的问题

原测试脚本如下:

@echo off &setlocal
set /p "header="<"old.csv"
>"your new.csv" echo.%header%
for /f "usebackq skip=1 delims=, tokens=1-26*" %%a in ("old.csv") do (
  if not "%%t" == "BR" 
  (
    >>"your new.csv" echo.%%a,%%b,%%c,%%d.....,%%Z
  )
)
可行实现方案

不需要拆分全部35列字段,仅需提取第19列值做判断即可,完全规避26个token的数量限制,脚本如下:

@echo off
setlocal enabledelayedexpansion
:: 配置输入输出文件路径
set "input_file=old.csv"
set "output_file=new.csv"

:: 写入CSV表头
set /p "header="<"%input_file%"
> "%output_file%" echo %header%

:: 逐行处理数据行(跳过第一行表头)
for /f "usebackq skip=1 delims=" %%line in ("%input_file%") do (
    set "cur_line=%%line"
    set "col_count=0"
    set "country_code="

    :: 循环拆分字段,仅提取第19列的值
    :split_col
    for /f "tokens=1* delims=," %%a in ("!cur_line!") do (
        set /a col_count+=1
        if !col_count! equ 19 (
            set "country_code=%%a"
            goto filter_check
        )
        set "cur_line=%%b"
        goto split_col
    )

    :: 过滤国家代码为IN、BR的行,/i参数表示不区分大小写
    :filter_check
    if /i not "!country_code!"=="IN" if /i not "!country_code!"=="BR" (
        >> "%output_file%" echo %%line
    )
)
endlocal

方案说明

  • 不受总列数限制:不需要拆分全部列,仅提取到第19列就停止拆分,哪怕CSV列数超过35也能正常处理
  • 无列错乱问题:判断通过后直接写入原始整行内容,不需要手动拼接各列字段,不会出现列顺序错误、遗漏的问题
  • 过滤逻辑完整:同时判断IN、BR两个值,增加大小写不敏感匹配,避免字段值大小写差异导致过滤失效

注意:如果你的CSV字段是用双引号包裹的格式(例如国家代码存储为"IN"而非IN),只需要把判断条件里的"!country_code!"替换为"!country_code:"=!",即可自动去除字段包裹的双引号后再做匹配。

内容的提问来源于stack exchange,提问作者satish kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:24:16