- ベストアンサー
Perlを用いて、XMLファイルの中のキーワードの個数を数えるプログラムを組もう
- Perlを使用してXMLファイル内のキーワードの個数を数えるプログラムを作成する方法について説明します。
- 具体的なXMLファイルの例を示し、<keyword>タグで囲まれたキーワードを数える方法を示します。
- また、出力結果の形式として、キーワードとその出現回数を持つ新しいXMLファイルを生成する方法も説明します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
最後にutf8で出力しているところで文字化けしているんじゃないですか? cp932、shiftjis、eucjpなど適切なエンコードを指定して下さい。 あまり関係ないけどちょっと書き直し(全角空白あり注意) use XML::TreePP; use Encode; my $file = shift || 'tmp.xml'; my $tpp = XML::TreePP->new( utf8_flag => 1, force_array => ['keyword'] ); my $tree_in = $tpp->parsefile($file); my %count_of = (); for my $hash_ref ( @{ $tree_in->{grant_award_list}->{grant_award} } ) { my $keyword = $hash_ref->{keywords}->{keyword}; for my $item ( @{$keyword} ) { $count_of{$item}++; } } my $tree_out = {}; $tree_out->{keywords} = [ map { { keyword => [$_], count => $count_of{$_} } } keys %count_of ]; my $xml = encode( "utf8", $tpp->write($tree_out) ); print $xml;
その他の回答 (2)
- _--_1l1_1_
- ベストアンサー率67% (102/152)
use XML::TreePP; use Encode; my $file = shift || 'tmp.xml'; my $tpp = XML::TreePP->new( utf8_flag => 1 ); my $tree_in = $tpp->parsefile($file); my %count_of = (); for my $hash_ref ( @{ $tree_in->{grant_award_list}->{grant_award} } ) { my $keyword = $hash_ref->{keywords}->{keyword}; if ( ref($keyword) eq 'ARRAY' ) { for my $item ( @{$keyword} ) { $count_of{$item}++; } } else { $count_of{$keyword}++; } } my $tree_out; my $index = 0; while ( my ( $keyword, $count ) = each %count_of ) { $tree_out->{keywords}->[$index]->{keyword} = $keyword; $tree_out->{keywords}->[$index]->{count} = $count; $index++; } # encoding="UTF-8" なのでutf8で出力する。 my $xml = encode( "utf8", $tpp->write($tree_out) ); print $xml;
補足
ありがとうございます。 やはり文字化けしてしまいました。 モジュールが合わないということなのでしょうか。
- _--_1l1_1_
- ベストアンサー率67% (102/152)
表示がくずれるので、以下、スペース2文字を全角のスペースにして書いてあることに注意 use XML::TreePP; my $file = shift || 'tmp.xml'; my $tpp = XML::TreePP->new( utf8_flag => 1 ); my $tree_in = $tpp->parsefile($file); my %count_of = (); for my $hash_ref ( @{ $tree_in->{grant_award_list}->{grant_award} } ) { my $keyword = $hash_ref->{keywords}->{keyword}; if ( ref($keyword) eq 'ARRAY' ) { for my $item ( @{$keyword} ) { $count_of{$item}++; } } else { $count_of{$keyword}++; } } my $tree_out; my $index = 0; while ( my ( $keyword, $count ) = each %count_of ) { $tree_out->{keywords}->[$index]->{keyword} = $keyword; $tree_out->{keywords}->[$index]->{count} = $count; $index++; } my $xml = $tpp->write($tree_out); print $xml;
補足
早速のお返事ありがとうございます。 <keyword>ではさまれた要素に漢字やひらがなを含んでいるため、文字化けしてしまいました。 どのようにすれば解決できますでしょうか。 よろしくお願いいたします。
お礼
コマンドプロンプトによる表示が原因でした。 頂いたプログラムによってXMLファイルを生成したら、正常に表示されていました。 本当にありがとうございました。
補足
何度もありがとうございます。 cp932、shiftjis、eucjpなど試してみましたが、どれも文字化けしてしまいました。 XMLファイルの保存形式や文字コードも確認しましたが、やはり無理でした。