如何在合并CSV的批处理脚本中添加列自动求和(Autosum)功能?
如何给合并CSV的批处理脚本添加列自动求和功能?
嘿,你现有的批处理脚本已经能很好地合并文件夹里的CSV文件了,但要给每一列加上自动求和功能,咱们得在现有逻辑基础上扩展一下——毕竟批处理处理数值计算不算它的强项,但咱们还是能实现需求的。
先回顾下你原来的合并脚本:
@ECHO OFF SET first=y SET newfile=Summary.csv for %%F in (*.csv) do IF NOT %%F==%newfile% ( if defined first ( COPY /y "%%F" %newfile% >nul set "first=" ) else ( FOR /f "skip=1delims=" %%i IN (%%F) DO >> %newfile% ECHO %%i ) )
这个脚本会把所有CSV合并成Summary.csv,并且只保留一份表头。接下来咱们要给它加上列求和的功能,具体思路是:合并完成后,读取每一行的数值列,累加每列的总和,最后在文件末尾追加一行"Total"加上各列的总和。
下面是修改后的完整脚本,我会在后面解释关键部分:
@ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION SET first=y SET newfile=Summary.csv :: 第一步:合并所有CSV文件(保留原逻辑) for %%F in (*.csv) do IF NOT %%F==%newfile% ( if defined first ( COPY /y "%%F" %newfile% >nul set "first=" ) else ( FOR /f "skip=1delims=" %%i IN (%%F) DO >> %newfile% ECHO %%i ) ) :: 第二步:准备求和的变量和表头处理 SET "header=" SET /a colCount=0 :: 读取表头,确定列数 FOR /f "delims=" %%h IN (%newfile%) DO ( SET "header=%%h" :: 计算表头的列数(按逗号分割) FOR %%c IN ("!header:,=" "!") DO SET /a colCount+=1 GOTO endHeaderRead ) :endHeaderRead :: 初始化求和数组,每个列的总和初始为0 FOR /a i=1 TO !colCount! DO SET sum[!i!]=0 :: 第三步:遍历数据行,累加每列的数值 FOR /f "skip=1delims=" %%l IN (%newfile%) DO ( SET "line=%%l" SET /a currentCol=0 :: 分割每行的列 FOR %%v IN ("!line:,=" "!") DO ( SET /a currentCol+=1 :: 尝试把当前值转为数字,累加(非数字的话会自动忽略,保持0) SET /a sum[!currentCol!]+=%%~v ) ) :: 第四步:构建总和行并追加到文件 SET "totalLine=Total" FOR /a i=2 TO !colCount! DO ( SET "totalLine=!totalLine!,!sum[!i!]!" ) >> %newfile% ECHO !totalLine! ENDLOCAL
关键部分解释:
SETLOCAL ENABLEDELAYEDEXPANSION:开启延迟变量扩展,这样在循环里修改和读取变量的时候能实时获取最新值,这是批处理处理循环内变量的必备操作。- 表头处理:读取合并后的CSV的第一行(表头),通过分割逗号来统计列数,方便后续初始化求和变量。
- 求和数组:用
sum[1]、sum[2]...这样的数组来存储每一列的总和,初始值都是0。 - 遍历数据行累加:跳过表头后,把每一行按逗号分割,尝试把每个列的值转为数字累加到对应的
sum变量里——如果列里是非数字(比如第一列的Name),累加操作会自动忽略,保持总和为0。 - 构建总和行:最后把"Total"和各列的总和拼接成一行,追加到
Summary.csv的末尾。
需要注意的是:这个脚本假设你的CSV里的数值列都是整数,如果有小数的话,批处理的SET /a无法处理小数,这时候可能需要借助PowerShell来实现更精准的小数求和(如果需要的话可以再调整)。
内容的提问来源于stack exchange,提问作者ashley
相关产品推荐
相关产品推荐

