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