全詰連データベース委員会による詰将棋データベース「T-BASE」の形式
データベースは次の3形式のファイルから構成される。
- 「図面ファイル」(*.dia)
- 「詰手順ファイル」(*.tjn)
- 「注釈ファイル」(*.rem)
1組の図面/詰手順/注釈ファイルには最大9999件の図面/詰手順が収録可能(作品番号が4桁のため)。
データベースのうち、図面ファイルは必須で、詰手順ファイル、注釈ファイルはなくても表示可能。実際には、注釈ファイルはあまり使用されていないようである。
- 2004-01-24 (Sat) 22:55:33 おかもと? : 浦壁さんの「TMK Play 1.3g について」を元に図面ファイルのフォーマットを修正。
図面ファイルのフォーマット
図面ファイル(.dia ファイル)内は、330byteで1レコードを構成。 1レコードは、全3行または4行のテキストデータ。
1行目 102byte
項目名 byte 持駒 8 飛角金銀桂香歩(歩のみ2桁) 持駒数 2 図面 90 1-9:1筋, 11-19:2筋, ... 81-89:9筋 各筋の区切りは"/" 図面の駒記号 大文字は玉方、小文字は攻方 玉=Q 飛=A 角=S 金=D 銀=F 桂=G 香=H 歩=J 龍=Z 馬=X 全=C 圭=V 杏=B と=N 空欄=スペース 改行 2
2行目 126byte
項目名 byte 作品番号 4 作者名 12 作者コード 4 出典 20 出典コード 3 出典中番号 6 発表年月 6 玉位置 2 詰手数 3 オリジナル 1 0:新作 1:再発表 2:改作 3:盗作 使用駒数 2 使用駒種類 9 飛角金銀桂香歩(歩のみ2桁) 記事 18 作品題名 10 実戦型 1 0:桂香なし 1:11香型 2:21桂型 3:11香21桂型 完全性 1 0:完全 1:余早詰 2:不詰 3:不詰・余早詰 4:変長 入賞歴 2 作品原出典 16 詰上り玉位置 2 詰上り駒数 2 改行もしくは詰上り攻方駒数 2
3行目もしくは2行目の続き 50byte
項目名 byte SAKU_ID 4 SAKUCOD_ID 4 SOURCE_ID 4 図面_ID 4 MOTI_ID 4 KPOS_ID 4 SIYOU駒_ID 4 駒数_ID 4 MOTINUM_ID 4 手数_ID 4 YEAR_ID 4 JISSEN_ID 4 改行 2
4行目もしくは3行目 52byte
項目名 byte 置駒種類 9 置駒数 2 置駒_ID 4 OKINUM_ID 4 MRK 1 ORG_NUM 5 KAITOU_SEG 5 KAITOU_DIF 3 HANTEN 1 SAKUJO 1 分類コード 13 分類コードもしくは発表日 2 改行 2
図面ファイルの例
これは3行形式の例。
0012100004 / / / / / zD / D S / QJ X / j / 0003初代宗桂 0000象戯馬法(元和版) 1020003 元和282017 12112321002慶= 秘=3 力=54 0 9307021516 320733482 444 214 1002592 4441465 608 5 1122000020825922592* 1204
詰手順ファイルのフォーマット
詰手順ファイル(.tjnファイル)内は、1行あたり最大240byteの可変長データとなっているが、実際のデータは1行あたり80byte以下の場合がほとんど。詰手順が複数行にわたる場合は詰手順の末尾に “/” をつけ、次行の行頭には同じ作品番号が並ぶ。
項目名 byte 作品番号 4 空白 1 詰手順 可変長 改行 2
詰手順ファイルの例
0003 14龍13金合22金同金13龍同玉24金12玉22角成同玉33金打21玉22歩12玉23金寄/ 0003 まで15手詰
注釈ファイルのフォーマット
注釈ファイル(.remファイル)は、1行72byte以下のテキストデータ。先頭に # + 作品番号 のある行からその作品番号の解説が始まり、次の # までがその作品番号の解説になる。
$1-$7 で色指定可能。$1=青、$2=赤、$3=紫、$4=緑、$5=水色、$6=黄、$7=白。
注釈ファイルの例
#0001 作品番号1番の注釈。 $6ここから黄色になる。$7行の途中で色を変更することも可能。 #0002 作品番号2番の注釈。 #
プログラムの例
jgawk のスクリプトで、T-BASEの図面ファイルにアクセスする例です。 perlでも同様のことが可能ですが、T-BASEは日本語名のファイルがあるので、ちょっとやりにくいかも。
# tbase1.awk # 図面(.dia) ファイルを検索して特定のものを抽出 # usage: jgawk -f tbase1.awk +%1 %2 # %1: 出力用図面ファイル名のヘッダ # %2: 検索対象ファイル # 抽出した図面ファイル %1.dia と中間ファイル %1.tmp を出力 # dia ファイルは3行もしくは4行で1レコードを構成 # 1行目 100byte #持駒 8 1-8 飛角金銀桂香歩(歩のみ2桁) #持駒数 2 9-10 #図面 90 11-100 # 1-9:1筋, 11-19:2筋, ... 81-89:9筋 各筋の区切りは"/" # 図面の駒記号 大文字は玉方、小文字は攻方 # 玉=Q 飛=A 角=S 金=D 銀=F 桂=G 香=H 歩=J # 龍=Z 馬=X 全=C 圭=V 杏=B と=N 空欄=スペース ## 2行目 124byte #通し番号 4 1-4 #作者名 12 5-16 #作者コード 4 17-20 #出典 20 21-40 #出典コード 3 41-43 #出典中番号 6 44-49 #発表年月 6 50-55 #玉位置 2 56-57 #詰手数 3 58-60 #オリジナル 1 61-61 0:新作 1:再発表 2:改作 3:盗作 #使用駒数 2 62-63 #使用駒種類 9 64-72 飛角金銀桂香歩(歩のみ2桁) #記事 18 73-90 #作品題名 10 91-100 #実戦型 1 101-101 0:桂香なし 1:11香型 2:21桂型 3:11香21桂型 #完全性 1 102-102 0:完全 1:余早詰 2:不詰 3:不詰・余早詰 4:変長 #入賞歴 2 103-104 #作品原出典 16 105-120 #詰上り玉位置 2 121-122 #詰上り駒数 2 123-124 ## 3行目もしくは2行目の続き 48byte ## ※全3行の場合、2行目の末尾が改行にならず、そのまま3行目に続く ## このとき、改行コードが2byteと計算して、全50byteとなる ## この2byte は詰上り攻方駒数になる #インデックス 48 1-48 ## 4行目もしくは3行目 50byte #置駒種類 9 1-9 #置駒数 2 10-11 #インデックス 24 12-35 #分類コード 15 36-50 BEGIN { # 出力ファイル名の指定.なければヘッダは"test" out_file = option("test") sub(/\..*/, "", out_file) tjn_file = out_file ".tjn" dia_file = out_file ".dia" print "出力図面ファイル名 = " out_file ".dia" > "/dev/stderr" out_file = out_file ".tmp" print "出力中間ファイル名 = " out_file > "/dev/stderr" taihi = "" count = 0 } { # if(FNR % 4 == 1) { if(length($0) == 100) { #レコード長 100バイト→1番目の行 data1 = $0 k = 1 # banmen = substr(data1, 11) #盤面 # 無仕掛図式(盤面がすべて玉方)のチェック # banmen2 = toupper(banmen) # if(banmen == banmen2) flag = 1 # for(i in dt) { # delete dt[i] # } # 駒位置 i,j に分解 # for(i = 1; i <= 9; i++) { # for(j = 1; j <= 9; j++) { # koma[i, j] = substr(data1, 10 + (i - 1) * 10 + j , 1) # dt[j] = dt[j] koma[i,j] # } # } # # for(i = 1; i <= 9; i++) { # if(dt[i] !~ " ") { # flag = 1 # } # } } else { k++ } if(k == 2) { data2 = $0 if(length($0) <= 124) { #レコード長124バイト→全4行の構成 recflag = 1 } # tesu = substr(data2, 58, 3) #詰手数 # gyokuichi = substr($0, 56, 2) #玉位置 # if(gyokuichi == "55") flag = 1 # name = substr($0, 5, 12) # 名前 # if(name ~ /看寿/) flag = 1 } if(k == 3 && recflag == 1) { data3 = $0 } if(length($0) == 50) { #レコード長 50バイト→最後の行 # if($0 ~ /^122000000/) flag = 1 # 飛角図式 # if($0 ~ /^100040000/) flag = 1 # 盤面銀一色 # flag で判定して出力 if(flag == 1) { count++ number = substr(data2, 1, 4) printf("%s\t%s\t%4d\n", FILENAME, number, tesu) > out_file # print substr(data2, 1, 4) > out_file # data2 = sprintf("%04d%s", count, substr(data2, 5)) print data1 > dia_file print data2 > dia_file if(recflag == 1) { print data3 > dia_file } print $0 > dia_file } recflag = 0 flag = 0 } } END { print "出力件数 = " count > "/dev/stderr" } ##### 参照関数 ##### # +がついた引数を取りこむ function option(opt) { if (ARGC > 1 && ARGV[1] ~ /^\+.*$/) { # オプション指定のチェック opt = substr(ARGV[1], 2) # 先頭の"+"を取り除く delete ARGV[1] # 配列を解放する } return opt }