[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[orca-users:05336] 求む!添削
 
- To: ORCA USER ML <orca-users@xxxxxxxxxxxxxx>
- Subject: [orca-users:05336] 求む!添削
- From: Naoki Shimaya <naoki-shimaya@xxxxxxxxxxxxxxxxxx>
- Date: Mon, 10 Nov 2003 18:56:02 +0900
こんばんは,島谷@恵庭です.
http://www.post.japanpost.jp/zipcode/dl/kogaki.html
で,全国の郵便番号をおさめたファイルをダウンロード
できるんですが,
このファイルを,ORCAのtbl_adrsにCOPY文で流し込める
ように変換するスクリプトを作ったんですが,
おかしなところがあるでしょうか?
なにせPerl暦,2,3日ですので...
使い方ですが,
ダウンロードした郵便番号ファイルを解凍して
orca$:./convert.pl < hoge.csv
とすると,標準出力に結果を出力します.
ファイル(hoge.sql)に落として,先頭に
COPY "tbl_adrs" FROM stdin;
を追加,末尾に
\.
を追加して,psql orca < hoge.sql
で,郵便番号が追加されます.
ただし,すでにデータが存在すると失敗するし,
連番号がおかしくなるので,あらかじめ
データを削除しておく必要があります...^^;)
くれぐれもバックアップはお忘れなく...
#!/usr/bin/perl
use Pg;
require "jcode.pl";
# 半角->全角変換テーブル
$from = "0123456789-()";
$to   = "0123456789-()";
# 変数初期化
$" = "\t";                   # 配列の区切りをタブに設定
$idx = 0;                    # 配列のインデックス
@out = ();                   # 出力
while ($a = <>)
{
   # 標準入力より読み込んだ文字列を,EUC に変換,半角カナは全角カナに.
   jcode::convert( \$a, 'euc', 'sjis', 'z' );
   $a =~ tr/"//d;            # " を削除.
   @x = split( /,/, $a );    # カンマで区切って,配列に格納.
   jcode::tr( \$x[5], $from, $to ); # 町域(カナ)の半角英数字を全角に.
   # 同一の郵便番号がある時は,rennum に1から始まる連番を設定.
   # (入力データは,同一郵便番号を1個所にまとめる.
   if ( $post == $x[2] )
   {
      if ( $rennum == 0 )
      {
         $rennum = 1;
         ${$out[$idx-1]}[2] = $rennum;
      }
      $rennum += 1;
   }
   else
   {
      $post = $x[2];
      $rennum = 0;
   }
   @y = ();
   @y = ( $x[0], $x[2], $rennum, $x[3], $x[4], $x[5], $x[6]. $x[7], $x[8] );
   @y = ( @y, $x[3].$x[4].$x[5], $x[6].$x[7].$x[8], $x[9], $x[12] );
   $out[$idx] = [@y];
   $idx += 1;
}
foreach ( @out )
{
   print "@{$_}\n";
}