#! /usr/local/bin/perl require 'jcode.pl'; #$B = 1;# 再あやつりデータの無視★日付変更未対応・R出力未対応 #$W = 1;# 曜日別統計出力 #$M = 1;# 月齢別統計出力 #$BAD = 1;# 操りミスしにくい期間を除く @moon = ("新月", "三日月", "七日月", "上弦の月", "十日夜", "十三夜", "満月", "十六夜", "居待月", "下弦の月", "二十日余月", "二十六夜"); @dow = ("火", "土", "水", "風", "氷", "雷", "光", "闇"); $CoP = 0; @name = ('A1', 'A2', 'A3', 'B1', 'B2', 'B3'); open(IN, 'ayaturu.txt'); open(CSV, '> ayaturu.csv'); @CSV = ('eyear', 'emon', 'eday', 'CoP', 'race', 'mainJobLv', 'subJobLv', 'area', 'pet', 'petLv', 'vyear', 'vmon', 'vday', 'vdow', 'vmoon', 'equip', 'result', 'recast'); $line = join(',', @CSV); &jcode'convert(*line, 'sjis', 'euc'); print CSV "$line\n"; while () { chomp; $CoP = 1 if //; if (/begin edate:(\d+)\/(\d+)\/(\d+)\;([^,]+),([A-Z]+\d+)\/([A-Z]+\d+),([^,]+),([^,]+),([^,]+)$/) { $eyear = $1; $emon = $2; $eday = $3; $race = $4; $mainJobLevel = $5; $subJobLevel = $6; $area = $7; $pet = $8; $petLv = $9; } if (/begin vtime: (\d+)\/(\d+)\/(\d+)\(([^)]+)\) (\d+):(\d+) <([^>]+)>/) { $vyear = $1; $vmon = $2; $vday = $3; $vdow = $4; $vhour = $5; $vmin = $6; $vmoon = $7; } if (/vdate: (\d+)\/(\d+)\/(\d+)\(([^)]+)\) <([^>]+)>/) { $nextvyear = $1; $nextvmon = $2; $nextvday = $3; $nextvdow = $4; $nextvmoon = $5; } if (/^[,ox|]+$/) { if (/x/) { $nomiss = 0; } else { $nomiss = 1; } @dat = split(/,/); for ($i = 0; $i < 6; $i++) { @d = split(//, $dat[$i]); $recast = 0; foreach $r (@d) { if ($r eq '|') { $vyear = $nextvyear; $vmon = $nextvmon; $vday = $nextvday; $vdow = $nextvdow; $vmoon = $nextvmoon; } elsif ($r eq 'o') { $o{'total'}[$i]++; $o{$vdow}++; $o{$vmoon}++; $o{'beforeCoP'}[$i]++ unless $CoP; $o{'afterCoP'}[$i]++ if $CoP; } elsif ($r eq 'x') { $x{'total'}[$i]++; $x{$vdow}++; $x{$vmoon}++; $x{'beforeCoP'}[$i]++ unless $CoP; $x{'afterCoP'}[$i]++ if $CoP; } if ($r eq 'o' || $r eq 'x') { @CSV = ($eyear, $emon, $eday, $CoP, $race, $mainJobLevel, $subJobLevel, $area, $pet,$petLv, $vyear, $vmon, $vday, $vdow, $vmoon, $name[$i], $r, $recast); $line = join(',', @CSV); &jcode'convert(*line, 'sjis', 'euc'); print CSV "$line\n" unless $BAD && $nomiss; $recast++; } } $dat[$i] =~ s/\|//g; if ($B) { if ($dat[$i] =~ /^o/) { $o{'totalB'}[$i]++; $o{'beforeCoPB'}[$i]++ unless $CoP; $o{'afterCoPB'}[$i]++ if $CoP; } elsif ($dat[$i] =~ /^x/) { $x{'totalB'}[$i]++; $x{'beforeCoPB'}[$i]++ unless $CoP; $x{'afterCoPB'}[$i]++ if $CoP; } } $xlen = length($dat[$i]) - 1; if ($xlen >= 2) { $cont{'total'}[$i] += $xlen - 1; $cont{'beforeCoP'}[$i] += $xlen - 1 unless $CoP; $cont{'afterCoP'}[$i] += $xlen - 1 if $CoP; } } } } close (OUT); close (IN); &display('[Total]', 'total'); &display('[Before CoP]', 'beforeCoP'); &display('[After CoP]', 'afterCoP'); if ($B) { &display('[Total B]', 'totalB'); &display('[Before CoP B]', 'beforeCoPB'); &display('[After CoP B]', 'afterCoPB'); } &dowstat() if $W; &moonstat() if $M; sub display() { ($title, $key) = @_; print "$title\n"; for ($i = 0; $i < 6; $i++) { $r = $o{$key}[$i]; $n = $o{$key}[$i] + $x{$key}[$i]; if ($n > 0) { $pd = $r / $n; $pm = 1.96 * sqrt($pd * (1 - $pd) / $n); } else { $pd = 0; $pm = 0; } printf "$name[$i]: %d/%d=%4.1f%%(+/-%.1f%%); cont=%d\n", $r, $n, $pd * 100, $pm * 100, $cont{$key}[$i]; } } sub dowstat() { print "[dowstat]\n"; for $w (@dow) { $r = $o{$w}; $n = $o{$w} + $x{$w}; if ($n > 0) { $pd = $r / $n; $pm = 1.96 * sqrt($pd * (1 - $pd) / $n); } else { $pd = 0; $pm = 0; } $line = sprintf("$w: %d/%d=%4.1f%%(+/-%.1f%%)", $r, $n, $pd * 100, $pm * 100); &jcode'convert(*line, 'sjis', 'euc'); print "$line\n"; } } sub moonstat() { print "[moonstat]\n"; for $m (@moon) { $r = $o{$m}; $n = $o{$m} + $x{$m}; if ($n > 0) { $pd = $r / $n; $pm = 1.96 * sqrt($pd * (1 - $pd) / $n); } else { $pd = 0; $pm = 0; } $line = sprintf("%-10s: %d/%d=%4.1f%%(+/-%.1f%%)", $m,$r, $n, $pd * 100, $pm * 100); &jcode'convert(*line, 'sjis', 'euc'); print "$line\n"; } }