• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Perlを用いて、XMLファイルの中のキーワードの個数を数えるプログラ)

Perlを用いて、XMLファイルの中のキーワードの個数を数えるプログラムを組もう

このQ&Aのポイント
  • Perlを使用してXMLファイル内のキーワードの個数を数えるプログラムを作成する方法について説明します。
  • 具体的なXMLファイルの例を示し、<keyword>タグで囲まれたキーワードを数える方法を示します。
  • また、出力結果の形式として、キーワードとその出現回数を持つ新しいXMLファイルを生成する方法も説明します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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;

riyoooh
質問者

お礼

コマンドプロンプトによる表示が原因でした。 頂いたプログラムによってXMLファイルを生成したら、正常に表示されていました。 本当にありがとうございました。

riyoooh
質問者

補足

何度もありがとうございます。 cp932、shiftjis、eucjpなど試してみましたが、どれも文字化けしてしまいました。 XMLファイルの保存形式や文字コードも確認しましたが、やはり無理でした。

その他の回答 (2)

回答No.2

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;

riyoooh
質問者

補足

ありがとうございます。 やはり文字化けしてしまいました。 モジュールが合わないということなのでしょうか。

回答No.1

表示がくずれるので、以下、スペース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;

riyoooh
質問者

補足

早速のお返事ありがとうございます。 <keyword>ではさまれた要素に漢字やひらがなを含んでいるため、文字化けしてしまいました。 どのようにすれば解決できますでしょうか。 よろしくお願いいたします。