数据库技术在索引编制中的应用
钱建兴 施建群
(复旦大学图书馆 上海 200433)
摘 要 介绍一种用Access数据库与Word文字软件合成处理编制索引的方法,并以实例详解用这种方法编制索引的过程和要点。
关键词 索引编制 数据库 Microsoft Office Access Word
索引的编制,由于编制过程繁缛,投入人力、物力多,编制周期漫长,这样,或是制约了文献出版的进度,或是滞后于文献出版,给读者快捷、准确利用文献带来不便。特别是编制《续修四库丛书》这样的大部文献丛书的索引,采用手工方法,更将是费工耗时,编期漫漫。
计算机数据库技术的发展与应用,为索引的编制提供了一个高效、简便的工具。采用计算机数据库技术编制索引,能使索引的编制达到事半功倍的效果。
编制《续修四库丛书索引》(以下简称《索引》),我们采用的是Access数据库软件以及Word文字处理软件。用Access处理索引数据的排序等问题,用Word处理索引排版中的问题,是一种充分利用Office软件文档共享、文档与数据库连接的强大功能,简洁、有效的合成处理方法,使得编制索引中的许多棘手问题得以轻松解决。
根据丛书、丛刊索引编制的要求,采用四角号码排序,如果手边没有四角号码字库,还需建立一个字库,可以度身定制,假如索引排序是取书名或者著者名的前三个字的四角码进行排序就能满足要求的话,那么用SQL查询语句逐字抽取书名字段和著者字段中前三个字,剔除重复出现的字建立一个四角号码字库,字库应有2个字段:[字]、[四角码]。然后手工填入四角码及补充码,有了这样一个基本字库后,以后再编制其他索引时还可以不断补充,经过几次索引编制的积累,这个字库就很壮大了。下面介绍《索引》的编制过程。
1 合并汇总书名和著者记录
根据要求,需有著者和书名两个索引点,两个索引点制作时处理方法不尽相同,一部丛书中同一著者可能有多篇著作,同一册次中也可能有同一著者的多篇著作,这都需用计算机做统一处理。表1是从《续修四库丛书》的原始书目数据表中抽出的几条记录:
表1 “xuxiu”数据表
书 名 | 著 者 | 册 次 |
礼记释注四卷 | 丁晏 | 第106册 |
春秋食日辨正一卷 | 王韬 | 第148册 |
春秋朔至表一卷 | 王韬 | 第148册 |
论语孔注证伪二卷 | 丁晏 | 第156册 |
文字蒙求四卷 | 王筠 | 第220册 |
陆右丞蹈海录一卷 | 丁元吉 | 第550册 |
这几条记录中,王韬在148册上有两篇著作,类似这样的重复记录需要作合并处理,假如以上书目记录表的名称为“xuxiu1”,有[书名]、[著者]、[册次]三个字段,在Access中(本例采用Access2000中文版)可用以下的几个步骤进行处理:
(1) 新建一个表“zhuzhe1”,这个表有2个字段:[著者]、[册次]。“zhuzhe1.[著者]”字段的数据类型、长度与“xuxiu1.[著者]”相同,“zhuzhe1.[册次]”字段的长度应比“xuxiu1.[册次]”长,设置成50个字节,并且为“zhuzhe1.[著者]”字段建立一个“无重复索引”。
(2) 在“对象”组合框里选择“查询”,然后用鼠标双击“在设计视图中创建新的查询”选项,随后跳出一个“显示表”对话框,把这个对话框关闭;再点击“视图(V)”菜单命令,在下拉式列表框中选择“SQL视图(V)”菜单,就出现一个“SQL查询编辑器”,在查询编辑器中写入以下语句:
INSERT INTO zhuzhe1(著者)
SELECT xuxiu.著者
FROM xuxiu
ORDER BY xuxiu.著者,xuxiu.册次;
这是一个“追加查询”,这条SQL语句是将“xuxiu”表以[著者]字段为第一排序,[册次]为第二排序,把记录中字段[序号]和[著者]的内容追加到“zhuzhe1”表中。执行这条语句,“xuxiu”表中6条记录,有4条追加到了“zhuzhe1”表中,这是因为“zhuzhe1”的“著者”字段建立了无重复的索引,把著者名重复的两条记录过滤掉了(见表2)。
表2 “zhuzhe1”数据表
(3) 在“SQL查询编辑器”中写入以下语句:
SELECT xuxiu.著者,xuxiu.册次,Count(xuxiu.册次)AS篇数INTOzhuzhe2
FROM xuxiu
GROUP BY xuxiu. 著者,xuxiu.册次
ORDER BY xuxiu. 著者,xuxiu.册次;
这条语句是在“xuxiu”表中增加了一个[篇数]字段,以[著者]字段作为分组,统计[册次]字段值相同记录的个数,将统计结果填入新增的[篇数]字段中;并且新建了一个数据表“zhuzhe2”,这个新建表有三个字段:[著者]、[册次]、[篇数],包含统计结果的所有记录,并以[著者]字段为第一排序,[册次]字段为第二排序的次序进行排序。
再写一条SQL语句:
UPDATE zhuzhe2 SET zhuzhe2.册次=[zhuzhe2]![册次]&“(”&[zhuzhe2]![篇数]&“)”WHERE(((zhuzhe2.篇数)>1));
这条“更新查询”语句把“zhuzhe2.[篇数]”字段的内容加在“zhuzhe.[册次]”字段内容之后,并加上括号,条件是[篇数]字段值必须大于1。
执行以上两条语句,结果见表3:
表3 数据表“zhuzhe2”
著 者 | 册 次 | 篇 数 |
丁晏 | 第106册 | 1 |
丁晏 | 第156册 | 1 |
丁元吉 | 第550册 | 1 |
王筠 | 第220册 | 1 |
王韬 | 第148册(2) | 2 |
(4) 下一步要执行一个多对一的连接查询:
UPDATE zhuzhe2 LEFT JOIN zhuzhe1 ONzhuzhe2.著者= zhuzhe1.著者SET zhuzhe1.册次=
[zhuzhe1]![册次]&“,”&[zhuzhe2]![册次];
这也是一条“更新查询”,这条SQL语句以[著者]字段作多(zhuzhe2)对一(zhuzhe1)的连接,以多条记录的“zhuzhe2.[册次]”字段值,填入的“zhuzhe1.[册次]”字段后面,且以逗号分开。执行结果见表4:
表4 “zhuzhe1”表
序 号 | 著 者 | 册 次 |
540 | 丁晏 | 第106册,第156册 |
1712 | 丁元吉 | 第550册 |
1061 | 王筠 | 第220册 |
752 | 王韬 | 第148册(2) |
到此为止,著者索引的前期处理已基本完成,下面要将“xuxiu”表中[书名]字段和“zhuzhe1”表中[著者]字段的记录内容合并汇总在一起,用Access按四角码处理索引的排序。处理步骤如下:
建立一个新表“huizong”,
字段:
[排序](文本,20);
[书名及著者](文本,50);
[册次](文本,30);
[字](文本,1)
这个新表建立以后,我们先将“xiuxiu”和“zhuzhe1”两个表的记录合并汇总到“huizong”表中,操作如下:
在SQL编辑器中写入以下语句:
INSERT INTO huizong(书名及著者,册次)
SELECT xuxiu.书名,xuxiu.册次
FROM xuxiu;
这也是一条“追加查询”,这条SQL语句执行后,“xuxiu”表的[书名]和[册次]字段,对应“huizong”表的[书名及著者]和[册次]字段,把“xuxiu”表的记录加到“huizong”表中。
再执行一条语句:
INSERT INTO huizong(书名及著者,册次)
SELECT zhuzhe1.著者,zhuzhe1.册次
FROM zhuzhe1;
这次是将“zhuzhe1”记录添加到“huizong”后面。见表5:
表5 数据表“huizong”
排序 | 书名及著者 | 册 次 | 字 |
| 文字蒙求四卷 | 第220册 | |
| 文通十卷 | 第196册 | |
| 辛丑日记不分卷 | 第583册 | |
| 辛卯侍行记六卷 | 第737册 | |
| 辛已泣蕲录一卷 | 第423册 | |
| 交翠轩笔记四卷 | 第1158册 | |
| 交食书一卷 | 第1040册 | |
| 交泰音员不分卷 | 第251册 | |
| 丁晏 | 第106册,第156册 | |
| 丁元吉 | 第550册 | |
| 王筠 | 第220册 | |
| 王韬 | 第148册(2) | |
2 按四角码的顺序对《索引》的记录进行排序
新建表“huizong的记录都添加好后,我们就要做下面的操作,来完成这个表的排序值:
执行以下SQL语句:
(1) UPDATE huizong SET huizong.字=Mid([书名及著者],1,1);
这也是条“更新查询”,这条语句把“huizong”表的[书名及著者]字段值的第一个字填入[字]字段,这里用了一个“Mid()”函数来抽取[书名及著者]字段里指定位置的字符,下面我们只要把“Mid”后面括号中参数值第一个“1”,换成“2”或“3”,就可以取得[书名及著者]字段中的第二或第三个字符。
(2) UPDATE huizong INNER JOIN sijiao ONhuizong.字=sijiao.字 SET huizong.排序=[huizong]![排序]&[sijiao]![四角码];
这条语句把“huizong”表与“sijiao”(四角码表)以[字]字段作连接,取“sijiao.[四角码]”字段的值加到“huizong.[排序]”字段后面。表6是“sijiao”表的数据样本。
表6 四角码表“sijiao”
字 | 四 角 码 |
文 | 00400 |
辛 | 00401 |
交 | 00408 |
王 | 10104 |
丁 | 10200 |
(3) UPDATE huizong SET huizong.排序=[huizong]![排序]&[huizong]![字];
执行这条语句取“huizong.[字]”字段的值加在“huizong,[排序]”字段的后面。
(4) UPDATE huizong SET huizong.字= Null;
用这条语句再清空“huizong.[字]”字段。
这样,我们就把“huizong.[书名及著者]”字段的第一个字的四角码及字填充了“huizong.[排序]”字段。再重复以上(1)-(4)的操作,我们把第二、第三个字的四角码和字加到[排序]后面。见表7:
表7 [排序]字段值填充已完成
排 序 | 书名及著者 | 册 次 | 字 |
00400文 30407字 44232蒙 | 文字蒙求四卷 | 第220册 | 蒙 |
00400文 37302通 40000十 | 交通十卷 | 第196册 | 十 |
00401辛 17104丑 60100日 | 辛丑日记不分卷 | 第583册 | 日 |
00401辛 77720卯 24241侍 | 辛卯侍行记六卷 | 第737册 | 侍 |
00401辛 77717已 30118泣 | 辛已泣蕲录一卷 | 第423册 | 泣 |
00408交 17408翠 51040轩 | 交翠轩笔记四卷 | 第1158册 | 轩 |
00408交 80732食 71269 | 交食书一卷 | 第1040册 |
|
00408交 50132泰 06686音员 | 交泰音员不分卷 | 第251册 | 音员 |
10200丁 60404晏 | 丁晏 | 第106册,第156册 | |
10200丁 10211元 40601吉 | 丁元吉 | 第550册 | 吉 |
10104王 88127筠 | 王筠 | 第220册 | |
10104王 42577韬 | 王韬 | 第148册(2) | |
下一个操作是新建一个表“suoyin”,建立以下字段:
[ID](自动编号);
[排序](文本,20);
[书名及著者](文本,50);
[册次](文本,30);
[字](文本,1);
[四角码](文本,1);
[补码](文本,1)。
[ID]字段将为每条记录自动产生一个序号,作为记录的惟一标志,这个表建好后,我们再用SQL语句作一个追加查询,把“huizong”表的记录按[排序]字段排序加到这个新表“suoyin”中去,类似的语句上面已经介绍过,这里不再重复。在“suoyin”表里,记录按照这样的规则排序:首先按[书名及著者]第一个字的四角码排序,四角码相同的,按这个字的音序排序,再按第二个字四角码、音序排下去。
3 根据《索引》排版要求,处理记录的字段值
下面的操作完全是因为以后排版的需要,对一些字段的记录值进行调整处理。
和前面我们曾做过的操作相似,在“suoyin”表中作以下几个处理:
(1) 把[书名及著者]字段的首字加到[字]字段;
(2) 用[字]字段作为连接,把四角码加到[四角码]字段中;
(3) 以[字]字段连接“suoyin”和“sijiao”两个表,做一个“更新查询”,在查询用Mid()函数,抽取四角码的第五位补码,把补码加到“suoyin.[补码]”字段中;
(4) 新建表“chongma”,设两个字段:
[ID](长整形数字)(建立无重复索引);
[四角码](文本,4)。
(5) 做一个“追加查询”,使“suoyin”表的[ID]、[四角码]字段与“chongma”表的两个字段对应,将“suoyin”表的记录追加到“chongma”表中,执行这个查询,我们并没把“suoyin”表中的记录全部追加到“chongma”表中,而是滤掉了“chongma.[四角码]”字段重复值的记录;
(6) 先用“更新查询”清空“suoyin.[四角码]”字段,使“suoyin”表所有记录的[四角码]字段为空值。再用[ID]字段连接“suoyin”和“chongma”两个表,做一个“更新查询”,用“chongma.[四角码]”字段值更新“suoyin.[四角码]”,这样“suoyin”表的[四角码]字段就没有重复值了;
(7) 与(4),(6)相似,我们用同样的方法,清除“suoyin”表[字]字段的重复值;
(8) 因为我们在《续修四库丛书索引》排版时,不同字的同一四角码用“~~”符号替代,所以我们要做一个有条件的“更新查询”添加“~~”符号,并符合这样的条件:“suoyin.[四角码]”字段是空值,以及“suoyin.[字]”字段不是空值。SQL语句是这样写的:
UPDATE suoyin SET suoyin. 四角码=“~~”
WHERE(((suoyin.四角码)Is Null) AND((suoyin.字)Is Not Null));
到此为止,我们已经完成了“suoyin”表的计算机处理。表8就是处理后的结果。
表8 “suoyin”表
ID | 书名及著者 | 册 次 | 字 | 四角码 | 补码 |
1 | 文字蒙求四卷 | 第220册 | 文 | 0040 | 0 |
2 | 文通十卷 | 第196册 | | | |
3 | 辛丑日记不分卷 | 第583册 | 辛 | ~~ | 1 |
4 | 辛已泣蕲录一卷 | 第423册 | | | |
5 | 辛卯侍行记六卷 | 第737册 | | | |
6 | 交翠轩笔记四卷 | 第1158册 | 交 | ~~ | 8 |
7 | 交泰音员不分卷 | 第251册 | | | |
8 | 交食书一卷 | 第1040册 | | | |
9 | 王韬 | 第148册(2) | 王 | 1010 | 4 |
10 | 王筠 | 第220册 | | | |
11 | 丁元吉 | 第550册 | 丁 | 1020 | 0 |
12 | 丁晏 | 第106册,第156册 | | | |
4 利用Word文本处理软件的邮件合并功能连接数据库,进行《索引》的排版工作
现在的问题是如何把数据库的文件输出成有排版格式的文本文件,我们做以下操作:
假如以上我们操作的名为“xuxiusiku.mdb”的Access数据库文件是存放在计算机驱动器C盘根目录下的,现在关闭掉该文件。
打开Word软件(本例使用Word 2000),点击菜单“工具”,在列表框里选择“邮件合并”后,出现“邮件合并帮助器”:
第1步,在“主文档”中点击“创建”按钮,选择“分类”后,出现一个对话框,点击“在活动窗口”按钮;
第2步,在“数据源”中点击“获取数据”按钮,选择“打开数据源”,出现一个“打开数据源”的对话框,我们在“对话框”的下方“文件类型”下拉式列表中选择“MSAccess数据库(*.mdb)”,在驱动器(C:)的文件目录表中找到“xuxiusiku.mdb”数据库,并点击“打开”按钮,这时出现一个“MicrosoftAccess”的对话框,在“表格”分页框里找到“suoyin”表,并按“确认”按钮,这时又出现一个“Microsoft Word”的对话框,在对话框中点击“编辑主文档”按钮。
现在我们回到了Word的主文档编辑窗,这时编辑框上部多出了一条“插入合并域”的工具栏,我们依次在“插入合并域”的下拉式列表框里选择[四角码]、[补码]、[字],把这些字段加到文档的第一行,再依次把[书名及著者]、[册次]字段加到文档的第二行,然后再打回车符,将文档第一行三个字段的字体加粗,把[补码]字段设为“下标”,在[补码]与[字]字段之间加两个空格,[书名及著者]与[册次]字段之间也加两个空格,见下图。
最后,完成文档的“邮件合并”:
点击菜单“工具”,选择“邮件合并”,在第3步“合并数据和文档”下点击“合并”按钮,出现“合并”对话框,点击“合并”按钮,等合并完成后,我们得到以下文档:
00400 文
文字蒙求四卷 第220册
交通十卷 第196册
~~1 辛
辛丑日记不分卷 第583册
辛已泣蕲录一卷 第423册
辛卯侍行记六卷 第737册
~~8 交
交翠轩笔记四卷 第1158同
交泰音员不分卷 第251册
交食书一卷 第1040册
10104 王
王韬 第148册(2)
王筠 第220册
10200 丁
丁元吉 第550册
丁晏 第106册,第156册
这就是计算机处理完成的《续修四库丛书索引》的最后文档,但是,千万不要以为已经大功告成了,还得仔细校对一下,比如汉字中多音字的排序,计算机不一定能准确排序,还必须人工干预调整。古籍索引的编制是严谨、规范的,不应有丝毫疏忽。
钱建兴 复旦大学图书馆馆员。
施建群 复旦大学图书馆助理馆员。