カテゴリ: プログラミング, API, C/C++, Javascript/Java, PHP, CakePHP, WSH/VBScript

ページ: << 1 ... 4 5 6 7 8 9 10 11 12 13 14 ... 16 >>

正規表現で住所分割

パーマリンク 2008/12/19 15:33:39 著者: kumaold メール
カテゴリ: プログラミング, PHP

美容室案内ネット一六社が正式オープンしたようなので、次なる目標としてデータ拡充の一環でホットペッパーBeautyのデータ取り込みをしている最中です。


ところがこのAPI、住所データが郵便番号すらない上、建物名も全て1つのフィールドに入っているため開発者には優しい仕様ではありません。

かといって、全4,000件のデータに手動で手を加えるのも気の遠くなる作業・・・


ということで正規表現で分割できないか挑戦してみました。

例外やら何やら全部は書ききれないので要約すると、これで大まかに「都道府県」「市区郡」「それ以下住所」「建物名」に分けます。

(東京都|北海道|[一-龠]+[府県]){1}([一-龠ぁ-ヶ]+[市区郡]){1}([一-龠ぁ-ヶー]+[0-9\-‐F番地号条線西東丁目の]+){1}\s*([\sa-zA-z0-9一-龠ぁ-ヶー、・\-\(\)\.\/\']*)

その後に郡以下の場合はこれで町村名を取り出します。

([一-龠ぁ-ヶー]+[町村]){1}

政令指定都市の市名も同様に分割できます。

しかし、平成の大合併のおかげで政令指定都市でもないのに市以下に区のつくところがいくつか誕生してしまいました。
(石狩市、伊達市、八戸市、盛岡市、奥州市、南相馬市、香取市、上越市、宇陀市、姫路市)

これらはうまいこと例外処理を施してあります。


1/15 以下、完全ソース公開

$addr = $_GET['addr'];
$addr_conv = mb_convert_kana($addr, 'a');
//正規表現で切り分け
mb_ereg("(東京都|[一-龠]+[府道県]){1}(石狩市|伊達市|八戸市|盛岡市|奥州市|南相馬市|香取市|上越市|宇陀市|姫路市|[一-龠ぁ-ヶ]+[市区郡]){1}([一-龠ぁ-ヶー]+[0-9\-‐F番地号条線西東丁目の]+){1}\s*([\sa-zA-z0-9一-龠ぁ-ヶー、・\-\(\)\.\/\']*)", $addr_conv, $match);
//郡の場合の町村分割
if (($_GET['town_split']) && mb_ereg("郡$", $match[2])) {
    mb_ereg("([一-龠ぁ-ヶー]+[町村]){1}([一-龠ぁ-ヶー]*[0-9\-‐F番地号条線西東丁目の]+)", $match[3], $town);
    $match[3] = $town[2];
}
//政令指定都市の区分割
if (($_GET['city_split']) && mb_ereg("区$", $match[2], $city) && $match[1] != "東京都") {
    mb_ereg("([一-龠ぁ-ヶ]+市){1}([一-龠ぁ-ヶ]+区){1}", $match[2], $city);
    $match[2] = $city[1];
}



Web用にそれなりのインターフェイスを作ったのがこちら。

住所分割ツール手抜き版

そのうちXML版(Webサービス)も作る予定。



住所と地名の大研究 (新潮選書)住所と地名の大研究 (新潮選書)
今尾 恵介

新潮社 2004-03-17
売り上げランキング : 188314
おすすめ平均

Amazonで詳しく見る

PostgreSQLのユーザ権限設定

パーマリンク 2008/12/15 23:38:15 著者: kumaold メール
カテゴリ: 仕事, プログラミング

最近は外回りの仕事で手一杯で開発の方にあまり手が回せないところですが、何もやってないように思われても困るのでw、ちょいとメモ書き的なことを。


本番環境のサーバでは、セキュリティ上データベースにアクセスされる権限を最低限するのが望ましいので、設定してみました。


権限の割り当ては、PostgreSQLコンソールに入った上でGRANTコマンドです。

GRANT 権限名 ON テーブル名 TO ユーザ名;

例: GRANT SELECT, UPDATE ON table_name TO user_name;


逆に割り当てた権限を削除するには、REVOKEコマンドを使います。

REVOKE 権限名 ON テーブル名 FROM ユーザ名;

例: REVOKE DELETE, EXECUTE ON table_name TO user_name;


現在の権限一覧を確認するには、"\z"を使います。

DBName=>\z
         Access privileges for database "DBName"
 Schema |       Name       |   Type   | Access privileges  
------+------------+------+------------
 public | table1           | table    | {user=arw/user}
 public | table2           | table    | {www=r/www}

この場合、テーブル"table1"にはユーザ"user"がSELECT, INSERT, UPDATEする権限があるということです。


割り当ての際の権限名との対応が分かりにくいので、まとめるとこんな感じ。

表示権限名
rSELECT読み取り(read)
wUPDATE書き込み(write)
aINSERT追加(append)
dDELETE
tTRIGGER
xREFERENCES
CCREATE
RRULE
TTEMPORARY
UUSAGE
XEXECUTE




PostgreSQL徹底入門 第2版PostgreSQL徹底入門 第2版
石井 達夫

翔泳社 2008-04-15
売り上げランキング : 38752

Amazonで詳しく見る
type="text/javascript">
type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">

fgetcsvでの文字化け

パーマリンク 2008/11/30 23:56:20 著者: kumaold メール
カテゴリ: プログラミング, PHP

宿泊案内ネットのデータ移行作業を担当することになったので、現行鯖のDBからCSV形式で取り出したデータを新形式に加工した際の苦労をひとつ。


普通にCSV形式のデータを読み込んで、PHPで整形したりする場合よく使うのがこんな感じでexplodeによる切り分けなわけです。

$row = explode(',' $csv);

しかし今回は、データ中にもカンマ(,)が入っているフィールドがあったため、見事にデータが分断されてしまいました。

そこで元からCSVの展開専用の関数fgetcsvを使えばその辺もしっかり対応しているわけですが、見事なまでの先頭文字の文字化け。

三重県→O重県、山口県→R口県、etc... (→ひどい例


そこでこのfgetcsvの使用前に、これを付けるといいらしい。

setlocale(LC_ALL, 'ja_JP');

まあ若干改善されてはいるものの、まだ文字化け箇所がありました。

どうもいろいろ探ってみると、PHP4→PHP5あたりの仕様変更バグ?とか何とか。



結局のところ、こちらにあった改良版のfgetcsv_regにて無事解決しました。

相変わらず、マルチバイト関係では何かと問題があるなぁ。

<?php
    /**
     * ファイルポインタから行を取得し、CSVフィールドを処理する
     * @param resource handle
     * @param int length
     * @param string delimiter
     * @param string enclosure
     * @return ファイルの終端に達した場合を含み、エラー時にFALSEを返します。
     */
    function fgetcsv_reg (&$handle, $length = null, $d = ',', $e = '"') {
        $d = preg_quote($d);
        $e = preg_quote($e);
        $_line = "";
        while ($eof != true) {
            $_line .= (empty($length) ? fgets($handle) : fgets($handle, $length));
            $itemcnt = preg_match_all('/'.$e.'/', $_line, $dummy);
            if ($itemcnt % 2 == 0) $eof = true;
        }
        $_csv_line = preg_replace('/(?:\r\n|[\r\n])?$/', $d, trim($_line));
        $_csv_pattern = '/('.$e.'[^'.$e.']*(?:'.$e.$e.'[^'.$e.']*)*'.$e.'|[^'.$d.']*)'.$d.'/';
        preg_match_all($_csv_pattern, $_csv_line, $_csv_matches);
        $_csv_data = $_csv_matches[1];
        for($_csv_i=0;$_csv_i<count($_csv_data);$_csv_i++){
            $_csv_data[$_csv_i]=preg_replace('/^'.$e.'(.*)'.$e.'$/s','$1',$_csv_data[$_csv_i]);
            $_csv_data[$_csv_i]=str_replace($e.$e, $e, $_csv_data[$_csv_i]);
        }
        return empty($_line) ? false : $_csv_data;
    }
?>


参考にしたサイト



[改訂版] PHP ポケットリファレンス (Pocket reference)[改訂版] PHP ポケットリファレンス (Pocket reference)
大垣 靖男

技術評論社 2005-09-17
売り上げランキング : 67001
おすすめ平均

Amazonで詳しく見る
type="text/javascript">
type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">

<< 1 ... 4 5 6 7 8 9 10 11 12 13 14 ... 16 >>

一六社で働くITエンジニアのブログ。

普段はWeb系システム開発と地元のPCサポートをやってます。いつの間にやら会社に8年目。
技術ネタ中心に日々の仕事と生活と趣味やらを気が向いたら書いてます。

2017年3月
 << <   > >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

検索

XMLフィード

16ブログ     powered by b2evolution free blog software