//小学館 日本大百科全書 データテキスト化マクロ NipToText プロトタイプ2 //for WZ4 //(c) 1999 Yujiro Nakamura //thanks to Junn Ohta. /*更新履歴 99/05/13(Tue)23:44 プロトタイプいちおう完成 99/05/27(Tue)03:59 細かい調整など(インデックス解析はあきらめる(T_T)) 99/12/08(Wed)06:25 途中から再開できるように */ /*使い方 1.「ツール」-「マクロ」-「実行」で実行 2.本文データ(bintxt.dat)と見出し語データ(BunIdx.dat)を置いたフォルダを指定 3.ひたすら待つ 4.WZがメモり不足で墜ちる(爆) 5.再度マクロを起動し、「開始ファイル番号」に無事出力できたファイルの番号(「temp~○○」の○○+1)を指定 6.3〜5繰り返し 多分、ぶっ通しで5日くらい、途切れ途切れやって15日くらいで完成すると思います(爆) なお、メモり不足でWZが矯正終了する前に、任意に中断したい場合は、Ctrl+Alt+Delを押してください(^_^;) できあがったら、temp~(0〜n).txtは消しちゃって良いです */ #define SPLITSIZE 1000000 //1MB変換ごとにファイル分割 #define MAKEINDEX_TEST 0 //1にすると、インデックスの作成のみでバイナリ->テキスト変換は行なわない mchar* GetTimeStr() { txstr szTime; sprintf(szTime,"%d/%d %d:%d",timeGetMonth(),timeGetDay(),timeGetHour(),timeGetMinute()); return szTime; } int BinToText(TX* text,txstr szFolder,int nStartFile) //bintxt.datからプレーンテキストへの変換 { text->fBinedit = TRUE; int i = nStartFile * SPLITSIZE; //再開できるように int nFile = nStartFile; TX* text2 = textnew(); txstr szFileName; txSetHigh(text); txRightBytes(text,i); //再開できるように while(!txIsCurEof(text)){ //SPLITSIZEで割って余りが0なら(ぴったりSPLITSIZEなら) if(i % SPLITSIZE == 0 && i / SPLITSIZE != nStartFile){ //0ではなくnStartFileで(再開時用) nFile = i / SPLITSIZE; sprintf(szFileName,"temp~%i.TXT",nFile); txSaveTo(text2,szFolder + szFileName); txDeleteText(text2); } TXCHAR c = txGetChar(text); //2バイト文字(の1バイト目)なら1バイトだけ取り出す if(txchIsKanji(c)){ c = ((BYTE)(((WORD)(c) >> 8) & 0xFF)); } c++; txInsertChar(text2,c); i++; statprintf("%dbyte変換(%c)",i,c); txRightBytes(text,1); } txResetHigh(text); sprintf(szFileName,"temp~%i.TXT",nFile + 1); txSaveTo(text2,szFolder + szFileName); textclose(text2); return nFile + 1; } void CombineText(TX* text,txstr szFolder,int nAllFile) //分割出力されたテキストの結合 { text->fBinedit = TRUE; txstr szFileName; int i; for(i=1;i<=nAllFile;i++){ sprintf(szFileName,"temp~%i.TXT",i); txInsertFile(text,szFolder + szFileName); } txJumpFileTop(text); } void MakeIndex(TX* text,TX* textIndex) { //BunIdx.datを利用して、テキストに見出しを振る int nArticle; txJumpFileTop(textIndex); //文字コード0x01の4連続の並びが、リンクのみの記事らしい //ので、まずはこれを特別な記号(●)に変換 txstr szJump; sprintf(szJump,"%c%c%c%c",0x01,0x01,0x01,0x01); txReplaceEx(text,szJump,"●",SEARCH_ALL); txstr szIndex; while(txSearchEx(text,"
",SEARCH_SELECT)){ //本文のはじまりのテキストアドレスを記憶 int adr = txGetAddressSelectEnd(text); txSelectQuit(text); //前の記事のおわりまで後退 while(txGetPrevChar(text) !='〉' && txGetPrevChar(text) !='。' && !txGetAddress(text) == 0){ txLeft(text); //●の場合は、インデックスをひとつ飛ばす if(txGetChar(text) == '●') txNextPara(textIndex); } //見出し文字列の取得 txJumpParaEnd(textIndex); txLeft(textIndex); txSelectEx(textIndex,CLIP_CHAR); txSearchEx(textIndex,"\"",SEARCH_PREV); txRight(textIndex); txGetWord(textIndex,szIndex); txNextPara(textIndex); //余計な制御コードなどの削除 txSelectEx(text,CLIP_CHAR); txJumpAddress(text,adr); txSelectDelete(text); //見出しの挿入 txInsertf(text,"\n【%s】",szIndex); nArticle++; statprintf("%i箇所変換【%s】",nArticle,szIndex); } } void main() { txstr szFolder = \"C:\Program Files\Shogakukan\SSN_TR\datas\"; int nFile = 1; HDIALOG hd = dialog("小学館 日本大百科全書 データテキスト化"); dialogControlRefer(hd,"-d"); dialogTxstr(hd,"日本大百科全書のdatasフォルダ",30,szFolder,40); dialogHeadline(hd,"以下は再開用",30); dialogInteger(hd,"開始ファイル番号(最後に出力したファイル+1)",35,&nFile,5); if(dialogOpen(hd)){ txstr szTimeStart = GetTimeStr(); pathSetDir(szFolder); #if MAKEINDEX_TEST #else TX* bintxt = textopen(szFolder + "bintxt.dat"); int nAllFile = BinToText(bintxt,szFolder,nFile - 1); textclose(bintxt); TX* textTemp = textnew(); CombineText(textTemp,szFolder,nAllFile); txSaveTo(textTemp,szFolder + "temp~0.TXT"); textclose(textTemp); #endif TX* text = textopen(szFolder + "temp~0.TXT"); TX* textIndex = textopen(szFolder + "BunIdx.dat"); MakeIndex(text,textIndex); txSaveTo(text,szFolder + "日本大百科全書.TXT"); textclose(text); textclose(textIndex); txstr szTimeEnd = GetTimeStr(); information("変換が終了しました。\n変換開始:%s\n変換終了:%s",szTimeStart,szTimeEnd); } }