ActivePerlでの日本語ファイル処理について。
環境
- WindowsXP Professional
- ActivePerl v5.10.0 built for MSWin32-x86-multi-thread
入力ファイルの条件
出力ファイルの条件
最終的に書いたコード
## ## 郵便番号データの整形出力 ## use utf8; use open ":utf8"; use open ":std"; use Encode; use Encode::JP::H2Z; $argv = $ARGV[0]; open FH,"<",$argv or die "Can't Open Source: $argv!"; print &insertHead; my $lc = 0; foreach $line (<FH>) { if( $lc>0 ) { print ",\n"; } unless( $line=~/^(\r\n|\n)?$/ ) { Encode::JP::H2Z::h2z(\$line); chomp $line; $line=~s/\r//g; print &line2insert($line); $lc++; } } print &insertFoot; close FH; #INSERT文頭 sub insertHead { my $tableName = shift; $tableName = ($tableName eq '')?"zipcode":$tableName; return "INSERT INTO $tableName (`id`,`zip7`,`pref`,`city`,`address`) VALUES\n"; }1; #SQL文末 sub insertFoot { return ";\n"; }1; #VALUE値 sub line2insert { my $line = shift; my(undef,undef,$zip7,undef,undef,undef,$pref,$city,$address,undef,undef,undef,undef,undef,undef) = split /,/,$line; $zip7=~s/\"//g; #" $pref=~s/\"//g; #" $city=~s/\"//g; #" $address=~s/\"//g; return "('', '$zip7','$pref' ,'$city' ,'$address')"; }1;
#実行方法 > converter.pl ken_all\KEN_ALL.utf8.CSV >kenAll.sql
出力:kenAll.sqlの内容
SET NAMES utf8; INSERT INTO zipcode(`id`,`zip7`,`pref`,`city`,`address`) VALUES ('', '0600000','北海道' ,'札幌市中央区' ,'以下に掲載がない場合'), ('', '0640941','北海道' ,'札幌市中央区' ,'旭ケ丘'), ('', '0600041','北海道' ,'札幌市中央区' ,'大通東'), ・・・・
未解決な問題
躓いたのは、入力ファイルの読み込み。
最初はファイルから読み込んだ文字列のエンコード変換もPerlにやってもらうつもりでいたのだが、行読み込み後にうまくutf-8に変換してやれなかった。(原因追求はまだ不十分)
半角かな⇒全角かな変換のために、Encode::JP::H2Z::h2z(\$line) って書いたけど、全角に置き換わらなかった。
もともと半角文字列が入るような列は使う用事がなかったので、無視する。
持ってきたデータファイルの文字エンコード変換には、結局nkfの力を借りた。
$ nkf --ic=CP932 --oc=UTF-8 KEN_ALL.CSV >KEN_ALL.utf8.CSV (on FreeBSD 5.5)
今後の予定
- やっぱりDBI使って、マシンからサーバに直接データをブッ込む。
- データの奪取と、DBへのブッ込みをバッチで定期実行する。