【Batch】2次元配列を扱う

Batchプログラムで2次元配列を扱います
科目データを個人・総合・性別ごとの合計・平均を求めています
遅延環境変数が必須なのでsetlocal enabledelayedexpansionを使います

data.txt

性別 名前 科目1 科目2 科目3

1 akiyama 67 89 78 
2 kimura 79 86 92 
1 tanaka 62 85 79
1 inoue 96 86 91
2 satou 69 74 70
2 nomura 89 85 71 
2 mutou 65 58 90
2 harada 78 85 82
1 ueda 93 84 69
1 enomoto 59 88 75 
2 okada 62 85 97
1 yamada 98 75 84 
2 watanabe 89 71 96 
1 chida 87 90 91

Avarage.bat

@echo off

setlocal enabledelayedexpansion
rem ファイルから2次元配列にデータを格納
set n=0
cd %~dp0
for /f "tokens=1,2,3,4,5" %%a in (data.txt) do (
  set name[!n!][0]=%%a
  set name[!n!][1]=%%b
  set name[!n!][2]=%%c
  set name[!n!][3]=%%d
  set name[!n!][4]=%%e
  set /a n=n+1
)
set /a n=n-1
set tmp=0
set avg=0
set total=0
set t1=0
set t2=0
set t3=0
set tm=0
set tm1=0
set tm2=0
set tm3=0
set tmc=0
set tw=0
set tw1=0
set tw2=0
set tw3=0
set twc=0
rem 各個人の成績と合計と平均
echo 名前 性別 科目1 科目2 科目3 合計 平均
echo ==============================================
for /l %%x in (0,1,!n!) do (
  set /a total=total+!name[%%x][2]!+!name[%%x][3]!+!name[%%x][4]!
  set /a t1=t1+!name[%%x][2]!
  set /a t2=t2+!name[%%x][3]!
  set /a t3=t3+!name[%%x][4]!
  if !name[%%x][0]!==1 (
    set /a tm=tm+!name[%%x][2]!+!name[%%x][3]!+!name[%%x][4]!
    set /a tm1=tm1+!name[%%x][2]!
    set /a tm2=tm2+!name[%%x][3]!
    set /a tm3=tm3+!name[%%x][4]!
    set /a tmc=tmc+1
  ) else (
    set /a tw=tw+!name[%%x][2]!+!name[%%x][3]!+!name[%%x][4]!
    set /a tw1=tw1+!name[%%x][2]!
    set /a tw2=tw2+!name[%%x][3]!
    set /a tw3=tw3+!name[%%x][4]!
    set /a twc=twc+1
  )
  set /a tmp=!name[%%x][2]!+!name[%%x][3]!+!name[%%x][4]!
  set /a avg=tmp/3
  echo !name[%%x][1]! !name[%%x][0]! !name[%%x][2]! !name[%%x][3]! !name[%%x][4]! total=!tmp! average=!avg!
)
echo ==============================================
rem 全体の科目ごとの合計と総合計と平均
set /a n=n+1
echo total=!total! 1total=!t1! 2total=!t2! 3total=!t3!
set ave=0
set ave1=0
set ave2=0
set ave3=0
set /a ave=total/!n!
set /a ave1=t1/!n!
set /a ave2=t2/!n!
set /a ave3=t3/!n!
echo allaverage=!ave! all1average=!ave1! all2average=!ave2! all3average=!ave3!

rem 男性の科目ごとの合計と総合計と平均
echo mantotal=!tm! man1total=!tm1! man2total=!tm2! man3total=!tm3!
set manave=0
set man1ave=0
set man2ave=0
set man3ave=0
set /a manave=!tm!/!tmc!
set /a man1ave=!tm1!/!tmc!
set /a man2ave=!tm2!/!tmc!
set /a man3ave=!tm3!/!tmc!
echo manaverage=!manave! man1average=!man1ave! man2average=!man2ave! man3average=!man3ave!

rem 女性の科目ごとの合計と総合計と平均
echo womantotal=!tw! woman1total=!tw1! woman2total=!tw2! woman3total=!tw3!
set womanave=0
set woman1ave=0
set woman2ave=0
set woman3ave=0
set /a womanave=!tw!/!twc!
set /a woman1ave=!tw1!/!twc!
set /a woman2ave=!tw2!/!twc!
set /a woman3ave=!tw3!/!twc!
echo womanaverage=!womanave! woman1average=!woman1ave! woman2average=!woman2ave! woman3average=!woman3ave!

結果

名前 性別 科目1 科目2 科目3 合計 平均
==============================================
akiyama 1 67 89 78 total=234 average=78
kimura 2 79 86 92 total=257 average=85
tanaka 1 62 85 79 total=226 average=75
inoue 1 96 86 91 total=273 average=91
satou 2 69 74 70 total=213 average=71
nomura 2 89 85 71 total=245 average=81
mutou 2 65 58 90 total=213 average=71
harada 2 78 85 82 total=245 average=81
ueda 1 93 84 69 total=246 average=82
enomoto 1 59 88 75 total=222 average=74
okada 2 62 85 97 total=244 average=81
yamada 1 98 75 84 total=257 average=85
watanabe 2 89 71 96 total=256 average=85
chida 1 87 90 91 total=268 average=89
==============================================
total=3399 1total=1093 2total=1141 3total=1165
allaverage=242 all1average=78 all2average=81 all3average=83
mantotal=1726 man1total=562 man2total=597 man3total=567
manaverage=246 man1average=80 man2average=85 man3average=81
womantotal=1673 woman1total=531 woman2total=544 woman3total=598
womanaverage=239 woman1average=75 woman2average=77 woman3average=85