如何编写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
相关产品推荐
相关产品推荐

