4 # Author:: Daigo Moriwaki
5 # Homepage:: http://sourceforge.jp/projects/shogi-server/
8 # Copyright (C) 2009-2012 Daigo Moriwaki <daigo at debian dot org>
10 # This program is free software; you can redistribute it and/or modify
11 # it under the terms of the GNU General Public License as published by
12 # the Free Software Foundation; either version 2 of the License, or
13 # (at your option) any later version.
15 # This program is distributed in the hope that it will be useful,
16 # but WITHOUT ANY WARRANTY; without even the implied warranty of
17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 # GNU General Public License for more details.
20 # You should have received a copy of the GNU General Public License
21 # along with this program; if not, write to the Free Software
22 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 # mk_game_results reads CSA files, then outputs a list of game results that
28 # is used by mk_rate to calcurate players ratings.
36 # Sample Command lines that isntall prerequires will work on Debian.
38 # * Ruby 2.0.0 or later
40 # $ sudo aptitude install ruby
44 # $ ./mk_game_results . > game_results.txt
49 # Parse a CSA file. A tab-delimited line format is
50 # time state black_mark black_id white_id white_mark filepath
51 # time:: YYYY/MM/DD hh:mm:ss
52 # black_mark:: win lose draw
53 # black_id:: black player's id
54 # white_mark:: win lose draw
55 # white_id:: white player's id
56 # filepath:: absolute file path
58 # @parameter file an absolute path of a csa file
61 if RUBY_VERSION >= "1.9.1"
62 str = File.open(file, "r:EUC-JP").read
64 str = File.open(file, "r").read
67 if /^N\+(.*)$/ =~ str then black_name = $1.strip end
68 if /^N\-(.*)$/ =~ str then white_name = $1.strip end
70 if /^'summary:(.*)$/ =~ str
71 state, p1, p2 = $1.split(":").map {|a| a.strip}
72 p1_name, p1_mark = p1.split(" ")
73 p2_name, p2_mark = p2.split(" ")
74 if p1_name == black_name
75 black_name, black_mark = p1_name, p1_mark
76 white_name, white_mark = p2_name, p2_mark
77 elsif p2_name == black_name
78 black_name, black_mark = p2_name, p2_mark
79 white_name, white_mark = p1_name, p1_mark
81 raise "Never reach!: #{black} #{white} #{p3} #{p2}"
85 if /^'\$END_TIME:(.*)$/ =~ str
89 if /^'rating:(.*)$/ =~ str
90 black_id, white_id = $1.split(":").map {|a| a.strip}
91 if black_id && white_id && (black_id != white_id) &&
92 black_mark && white_mark && state && time
93 puts [time, state, black_mark, black_id, white_id, white_mark, file].join("\t")
103 USAGE: #{$0} [options] DIR...
104 DIR where CSA files are looked up recursively
106 --help, -h show this message
114 parser = GetoptLong.new(
115 ["--help", "-h", GetoptLong::NO_ARGUMENT])
118 parser.each_option do |name, arg|
120 $options[name] = arg.dup
124 raise parser.error_message
132 while line = $stdin.gets do
133 next unless %r!.*\.csa$! =~ line
134 grep File.expand_path(line.strip)
137 while dir = ARGV.shift do
138 Dir.glob( File.join(dir, "**", "*.csa") ) {|f| grep(File.expand_path(f))}
147 # vim: ts=2 sw=2 sts=0