perlでxlsxデータを

仕事で、定型フォーマットのxlsxのデータを抽出する必要があって、
数十個だったら、無理やりコピペで頑張るかと思ったけど、4桁近い数のエクセルファイルだったので
手作業でやるのは諦めモード。


最初はマクロなりVBAでやらないといけないのかと思ってみたけど
perlなら、モジュールが公開されているのでもしやと思い、


適当にネットで調べて、Spreadsheet::ParseXLSX でやれば出来そうだったので
やってみたところ、一部の日本語に読み仮名がついてきてしまう事象が発生。


まさに、このリンク先の人と同じ事象
Perl (CPANモジュール) SpreadSheet::XLSX で読みがなまで読み出されてしまう問題 :: OMIMO.net/デザインとクラフトワークと、写真と映像と、少しのプログラム


この記事を書いたときには、xlsxのモジュールは、SpreadSheet::XLSX がCPANに合ったみたいだけど
結構古くて、2014/01時点では、もうなかった。


仕方がないので、ParseXLSX.pmのソースを追いかけて、以下のように修正したところ
読み仮名が出力されなくなったので、無事、解決。

package Spreadsheet::ParseXLSX;
BEGIN {
  $Spreadsheet::ParseXLSX::AUTHORITY = 'cpan:DOY';
}
{
  $Spreadsheet::ParseXLSX::VERSION = '0.09';
}
…
sub _parse_shared_strings {
    my $self = shift;
    my ($strings) = @_;

    return [
        map {
            my $node = $_;
            # XXX this discards information about formatting within cells
            # not sure how to represent that
            #{ Text => join('', map { $_->text } $node->find_nodes('.//t')) } # コメントアウト
            { Text => &remove_rph_text($node) }                               # 追加 
        } $strings->find_nodes('//si')
    ];
}

#このメソッドを追加
sub remove_rph_text {
    my $node = shift;

    my @t_tag = $node->find_nodes('.//t');
    my @rph_tag = $node->find_nodes('.//rPh');

    my $return_text = "";

    foreach (@t_tag){
        my $t_text = $_->text;

        my $flag = "1";

        LOOP:
        foreach (@rph_tag){
            my $rph_text = $_->text;
            if($rph_text eq $t_text){
                $flag = "0";
                last LOOP;
            }
        }

        $return_text = $return_text.$t_text if($flag);
    }

    return $return_text;
}


もっと綺麗に書ける人はいると思うけど、データ分析しないといけないし、やりたい事は
出来るようになったので満足。


久々に、プログラムを追っかけていったけど、やっぱり面白い。