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; }
もっと綺麗に書ける人はいると思うけど、データ分析しないといけないし、やりたい事は
出来るようになったので満足。
久々に、プログラムを追っかけていったけど、やっぱり面白い。