再说Mdx的字典文件处理
上次说了Mdx的字典文件的处理并不难,难的是出现个例就是麻烦事。如音标的处理。在《21英汉大词曲》里的音标用方括号来标识。但在这本词典里,用方括号的还不止这一种,还有别的如“[口语]”、“[美国英语]”、“[俚语]”等等,在EmEditor里查找:\[[^一-龥]{0,50}\]可以查找所有的音标,但第一个就出例外了。第一个是 a [强ei,弱ə]就是例外。还有多少个例外呢?
就《21英汉大词曲》而言,经过粗略的整理,呈下图中的格式:
图一
第一种,单词+Tab+单词+1……
第二种,单词+Tab+单词+词性.1……
第三种,单词+Tab+单词+音标+1……
第四种,单词+Tab+单词+音标+词性.1……
但作为一个三维数据表,我需要的是这样
图二
所以,很多的努力都是要把图一的柱子变成图二。
用emEditor来做,方便是方便,就怕出现例外。实际上也确实存在例外。以至于到现在为止我的词典数据都是残缺的。为什么残缺?就是因为出现了例外。好在例外毕竟是少数,也就将就用了。
……
有时候,灵感远比技术值钱得多。一旦灵感来了,技术就是小菜一碟。
所有的mdx字典文件都有一个特点,就是主单词(或被查询词)后面都有一个Tab,这为做成二维数据表提供了极大的方便。
将mdx文件稍作处理后,成下面图三的样子:
图三
保存好退出。
用Access导入。为什么要用Access导入成数据表?过程中发现,从TXT文本导入数据表,Access比Sql Server好用。所以要过度一下。
成功后再导入到SQL
图四
因为要把F2里与F1相同的内容处理掉,用replace()函数。但不能直接用。为什么?还是怕出现例外。比如说,主单词是abandon,
图五
看到在abandon这个词条里有那么多个abandon,如果现在用replace(),就会把所有的abandon都替换掉了。上面说的灵感来了!就是把词条中的第二个abandon再加上几个字符放到字段F3里。
update [GYYQ].[dbo].[21世纪大英汉词典]
set f3=left(f2,len(f1)+5)
先查询一下看看结果:
图六
对!要的就是图六的这个效果。
接下去要把F2中与F3相同内容的部分去掉,等处理完后再加回来。
update [GYYQ].[dbo].[21世纪大英汉词典]
set f2=replace(F2,F3,'')
结果如图七
图八
这时候就可以把F3中与F1相同的内容替换掉了。
update [GYYQ].[dbo].[21世纪大英汉词典]
set f3=replace(F3,F1,'')
处理好的如下图:
图九
再把处理好的内容加回到F2
图十
这就是想要的格式了。不过还差一步,要把音标抽出来。所以,再次把F3替换成Null备用。
注意:SQL的Charindex()函数查找的位置是字段中第一个出现的位置。现在要把音标抽出来,就要定位字段F2中第一个出现“]”的位置,即:Charindex(‘)’,F2)。但这样就把所有的“]”都定位出来了。
图十一
很显然,图十一不是想要的结果。
观察F2目前的数据,看到那些有音标的词条都以“[”开头。但在SQL里,where f2 like ‘[%’ 是不行的。需要一个转义,即
where f2 like '/[%' escape '/'
图十二
这才是想要的结果。
update [GYYQ].[dbo].[21世纪大英汉词典]
set f3=left(f2,charindex(']',f2))
where f2 like '/[%' escape '/'
图十三
接近尾声了!还差最后一步,就是用F3的内容去年F2里相同的,即把现在F2中的音标去掉。
大功告成!
图十四
至于其它如把变形词抽出来,那是另一个需要解决的问题了。