ActivePerlでの日本語ファイル処理について。

やりたいこと

  • MicrosoftExcel等で作成した、CSVファイルを処理する。
  • CSVファイルを行列に分解して、mysqlデータベースのテーブル等に投入する目的。

環境

入力ファイルの条件

出力ファイルの条件

  • utf-8文字列として出力したい。
  • 半角カナやSJIS機種依存文字('①','〓'等)は、それぞれ全角カナ,同意の文字列'(1)','(株)'に置き換えたい。
  • SQLを記述したファイルとなる。⇒ファイル処理とDBが隔絶しているので、DBIで直接投入はしない。

スクリプトファイル

  • perlで書きたい。
  • utf-8で記述したい。
                                                          • -

最終的に書いたコード

##
## 郵便番号データの整形出力
##
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へのブッ込みをバッチで定期実行する。