キーワード検索を「あいまい」化・・・その後のカタカナ濁音の対応

6月 20th, 2022 No comments

すごく久しぶりに当方のサイトの管理画面に入って見ました。最終の投稿は2021.6.16なので、サホドではなかったデスね。

さて、その投稿も予約語に関する再度の覚書でしたが、実は今回も2012.3.15のキーワード検索を「あいまい」化の再検討のオハナシです。

今まで作成してきたシステムはマスタデータの登録は、手入力の画面も用意してはありますが、基本的には別システムのデータをcsv形式でインポートさせちゃうので、カタカナに関しては全角なのか?半角なのか?は、統一されておりました。

ちなみに、当方では2004年から専門学校でコンピュータの講義をさせてもらってますが、この半角カタカナを採用せざるを得なかった当時のジジョウや、これは当時はもちろん現在でもガラパゴス的なモノなので、「極力使うな!」否「使ってはイケナイ!」・・・などと申しております。

今回、困ったのはこの全角カタカナと半角カタカナが混在するデータがありまして、検索の際にカタカナの濁音問題で、欲しいデータがヒットしないとの声を頂いたのです。

ウーム。これは困った。濁音カタカナは全角では1文字だが半角では2文字だぞ。検索キーをプログラムで、全角バージョンと半角バージョンに変換して、「or」で処理するか????
なんぞと、おバカな構想をしておりましたが、ググってみればよい知恵を出してくれているでは「あ~りませんか」。

そうです。ぜんかいと同様にD/Bに依存しちゃいますが、D/B側の関数で処理します。

以下に今回参考にさせてもらいながら作った関数を書きますね。

—————————–

CREATE OR REPLACE FUNCTION conv(param character varying)
RETURNS character varying AS
$BODY$
declare
c_half character varying :=param;
begin
–アルファベットの変換
c_half = translate(c_half,
‘abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’,
‘ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ’
);
–数値
c_half = translate(c_half,
‘1234567890’,
‘1234567890’
);
–カタカナ(濁音)
c_half := replace(replace(replace(replace(replace(replace(c_half,’ヴ’,’ヴ’ ) ,’ガ’,’ガ’ ),’ギ’,’ギ’ ),’グ’,’グ’ ),’ゲ’,’ゲ’ ),’ゴ’,’ゴ’ );
c_half := replace(replace(replace(replace(replace(c_half ,’ザ’,’ザ’ ),’ジ’,’ジ’ ),’ズ’,’ズ’ ),’ゼ’,’ゼ’ ),’ゾ’,’ゾ’ );
c_half := replace(replace(replace(replace(replace(c_half ,’ダ’,’ダ’ ),’ヂ’,’ヂ’ ),’ヅ’,’ヅ’ ),’デ’,’デ’ ),’ド’,’ド’ );
c_half := replace(replace(replace(replace(replace(c_half ,’バ’,’バ’ ),’ビ’,’ビ’ ),’ブ’,’ブ’ ),’ベ’,’ベ’ ),’ボ’,’ボ’ );
c_half := replace(replace(replace(replace(replace(c_half ,’パ’,’パ’ ),’ピ’,’ピ’ ),’プ’,’プ’ ),’ペ’,’ペ’ ),’ポ’,’ポ’ );
–カタカナ
c_half = translate(c_half,
‘アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォカケッャュョワ’,
‘アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォヵヶッャュョヮ’
);
–ひらがな
c_half = translate(c_half,
‘あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽぁぃぅぇぉっゃゅょゎ’,
‘アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲンガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポァィゥェォッャュョヮ’
);
/*
–記号
c_half = translate(c_half,
‘ !”#$%&()ー-=^~|@`「[{;+:*」]}、,<。.>・/?_’,
‘ !”#$%&()ー-=^~|@‘「[{;+:*」]}、,<。.>・/?_’
);
*/
c_half := replace(c_half,””,’’’ );
c_half := replace(c_half,chr(92),’¥’ );
return c_half;
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

—————————–

上記で、コメントアウトしている記号の部分は活かすと上手く行かなかったのでハズしました。

# ちなみに専門学校の学生に紙に文字を書かせると「この講義の内容を仕事に生かして」と、「活かして」が書けない学生が非常に多いです。

今回の試行錯誤で、最初に参考にした関数を使うと、postgres9.hogehogeでは動作して「よし、対応出来たゾイ」と、幕を下ろすハズだったのですが、なんとpostgres8.hogehogeでは動作しなかったのです。

調べるとマズ、8ではplpgsqlがないとのことで、

createlang -d mighty plpgsql

posgre君のコマンドプロンプトから上記を実行。

でも、ダメっぽい。

さらに試行錯誤して、どうやら引数の受け取りが上手く出来ていない感があるので、上記のように型名だけでなく変数名も宣言して、declareで代入と動作しました。

# 引数の配列的な宣言$1が解釈できなかったのカナ?

以上、理屈はとも角、動けばヨイというショーモナイ対応でアリました。

追記:あとレスポンスにエライ時間かかるようになるから、半角カタカナが居ない環境ではヤメタ方がイイネ!

恐ろしや予約語2

6月 16th, 2021 No comments

以前にもヤラレてました。過去の例

サーバー側では問題ないのに、DWRを介してjavascriptを経由すると、関連付けられたクラスが親クラスになってしまいました。

約3日ハマリましたが、結局前回同様に予約語っぽいです。

前回はgetter,setterでの命名で

staDate ◯: endDate ☓ / finDate ☓
opnDate ◯: clsDate ☓ / closeDate ☓
birthDate ☓: deathDate ◯

startDate ◯ : finishDate ◯

でしたが、今回は
Patientというクラスの要素であるorganizationとpersonで、コイツら自体には問題はありませんでしたが、このPatient君(hoge病院のhoge太郎)やMember(hoge会社のhoge太郎)といった【どこか】に所属する【何がしか】を表現するスーパークラスAssign君がいらっしゃるのです。

で、コイツ(Assign)は色々な【どこか】(party)と【何がしか】(elem)という各マスタ要素の上位クラス(Master)のフィールドを保持しているのです。

で、personを保持するgetElem,setElemは問題ないのに(javascriptではpatient.personとして捉える)、organizationを保持するgetParty,setPartyがエラーとなる(javascriptではpatient.organizationとして捉える)。

party ☓

さんざん悩んで、partyをgroupにしてもエラー

group X

elem2としたらOK

本当に予約語的なトラブルなのだろうか?よくは調べがつかないが、そのように考えざるを得ない状況ではあるので「よし」とする。

Categories: Mighty構想 Tags:

Excelのcsv出力は手強い

4月 24th, 2018 No comments

最近の開発では、データのimportやexportの機能を付けて大量の入出力を処理しますよね。

で、exportはもちろんcsv形式それもtab区切りにすればデータ内にカンマが存在しても問題なく、excelでも何でも使って利用してくださいな・・・ってことです。(データ内にtabがいるハズもないように作ってありますから)

問題はimportなんですなぁ。相手がシステムであればキレイなcsvを吐き出してくれたりしますが、問題はexcelから吐き出したcsvなのです。(タブ区切りであろうがカンマ区切りであろうが)

セル内改行なんぞというワープロちっくなレイアウトのシートでは、吐き出すと行の途中で改行されちゃいます。その実態であるLF(chr[10])を置換から「Ctrl J」で指定することで回避できるとのことですが、これで致命的な途中改行はなくなりますが、吐き出してみるとソコココに区切りじゃないタブが連打されていたりします。(どうやらコイツらはセル内改行とは無関係な感じですが)

で、clean関数を使ってやればOKなのですが、これは関数なので定型業務ではマクロか何か噛ませてやらないと、運用担当者が大変になっちゃいそうですね。

ここまでヒィーヒィー言いながらも、進めて行っても、さらに、出力ファイルをチェックすると・・・。文字列部分がダブルクォーテーションで囲まれていたり、いなかったり?意地になって色々テストしてみました。

そしたらね。フツーの文字列はそのまま出力されるんですが、文字列の中に怪しいヤツ(例えば「,」「”」がいると、勝手にダブルクォーテーションで囲んでくれているようです。

データを活かすなら取り込み時の処理で囲まれてたらハズすようなコーディングをしなければいけませんね。データの整合がさほどシビアでなければexcelのうちに「、」「”」に置換するとかね。いずれにしても手間です。

もう、ウンザリですね。

Categories: MS-Office Tags: