「T-BASE」の形式

全詰連データベース委員会による詰将棋データベース「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
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

This blog is kept spam free by WP-SpamFree.