批处理脚本读取CSV文件数据输出不符预期,请求排查代码问题
批处理脚本提取CSV数据异常问题排查
问题概述
尝试用批处理脚本从CSV文件提取数据存入二维数组并展示,但输出不符合预期,现排查代码问题。
现有代码
@echo off setlocal enabledelayedexpansion set var1=0 for /F "tokens=1* delims=," %%a in (text.csv) do ( set var2=0 set var3=0 set array[!var1!][!var2!]=%%a set /a var3=var2+1 set array[!var1!][!var3!]=%%b set /a var3+=1 set array[!var1!][!var3!]=%%c set /a var1+=1 ) echo First column, First element: %array[0][0]% echo First column, Second element: %array[0][1]% echo First column, Third element: %array[0][2]% echo Second column, First element: %array[1][0]% echo Second column, Second element: %array[1][1]% echo Second column, Third element: %array[0][2]% pause >nul
text.csv内容
DK joshi,152,uttarakhand,1 amit,154,UP,2 pooja,36,Haryana,3 naveen,565, uttar pradesh,4 suyal,985,uk,5
当前输出
First column, First element: DK joshi First column, Second element: 152,uttarakhand,1 First column, Third element: %c Second column, First element: amit Second column, Second element: 154,UP,2 Second column, Third element: %c
期望输出
First column, First element: DK joshi First column, Second element: 152 First column, Third element:uttarakhand Second column, First element: amit Second column, Second element: 154 Second column, Third element: UP
问题分析
for /F的tokens参数配置错误
原代码用tokens=1*,这会把CSV第一列内容赋值给%%a,剩余所有列(包括列间的逗号)全部打包赋值给%%b,导致%%b是152,uttarakhand,1这类包含多个列的字符串;同时%%c根本未被定义,所以输出时会直接显示%c。数组索引逻辑冗余且错误
代码中var2和var3的使用完全多余,且最后一行输出写错了索引——array[0][2]应该是array[1][2],对应第二行第三列。延迟扩展使用不彻底
循环内用!赋值数组,但输出时用%array[x][y]%,虽然部分场景能取到值,但严格来说需要用!array[x][y]!才能确保读取到循环中动态赋值的变量。
修正后的代码
@echo off setlocal enabledelayedexpansion set row=0 for /F "tokens=1,2,3 delims=," %%a in (text.csv) do ( rem 分别将前三列存入二维数组的对应位置 set "array[!row!][0]=%%a" set "array[!row!][1]=%%b" set "array[!row!][2]=%%c" set /a row+=1 ) echo First column, First element: !array[0][0]! echo First column, Second element: !array[0][1]! echo First column, Third element: !array[0][2]! echo Second column, First element: !array[1][0]! echo Second column, Second element: !array[1][1]! echo Second column, Third element: !array[1][2]! pause >nul
修正说明
- 将
tokens=1*改为tokens=1,2,3,让%%a、%%b、%%c分别对应CSV的前三列,避免剩余列打包。 - 简化索引逻辑,用
row变量记录行号,列号直接用0、1、2对应前三列,代码更清晰。 - 输出时统一用
!array[x][y]!,确保正确读取延迟扩展变量。 - 修正了最后一行输出的索引错误。
内容的提问来源于stack exchange,提问作者DK JOSHI
相关产品推荐
相关产品推荐

