[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[orca-users:05336] 求む!添削



こんばんは,島谷@恵庭です.

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";
}