Perlを用いて、XMLファイルの中のキーワードの個数を数えるプログラムを組もうと思っています。
次のようなXMLの中の<keyword>のタグに囲まれた文字列を数えるプログラムです。
<?xml version="1.0" encoding="UTF-8"?>
<grant_award_list>
<grant_award id="1001">
<title>タイトル1</title>
<keywords><keyword>A</keyword><keyword>B</keyword></keywords>
</grant_award>
<grant_award id="1002">
<title>タイトル2</title>
<keywords><keyword>B</keyword></keywords>
</grant_award>
</grant_award_list>
このようなときに、次のようにキーワードとその出現回数が記載されたXMLファイルにしたいと考えています。
<?xml version="1.0" encoding="UTF-8"?>
<keywords>
<keyword>A</keyword>
<count>1</count>
</keywords>
<keywords>
<keyword>B</keyword>
<count>2</count>
</keywords>
具体的なプログラムのコードを教えてください。よろしくお願いします。
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;
この回答への補足
何度もありがとうございます。
cp932、shiftjis、eucjpなど試してみましたが、どれも文字化けしてしまいました。
XMLファイルの保存形式や文字コードも確認しましたが、やはり無理でした。
コマンドプロンプトによる表示が原因でした。
頂いたプログラムによってXMLファイルを生成したら、正常に表示されていました。
本当にありがとうございました。
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;
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;
この回答への補足
早速のお返事ありがとうございます。
<keyword>ではさまれた要素に漢字やひらがなを含んでいるため、文字化けしてしまいました。
どのようにすれば解決できますでしょうか。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perl cgiの文字化けを直したい ...
-
ExcelをCSV書き出す場合のシー...
-
エクセルVBA コードが同じでも...
-
VBAでCSVファイルを途中行まで...
-
batファイルでrenameができませ...
-
VBAでCSVファイルの特定行を書...
-
VBAでタブ区切りテキストの保存...
-
全角と半角文字が混在している...
-
バッチファイルの作り方(CSV→...
-
sprintfについて
-
close()で例外が投げられる理由
-
拡張子 ”log” と ” dat” の違い
-
Perlで特定行から特定行までを...
-
ファイル名を複数個配列で確保...
-
openした後、closeしないでプロ...
-
ディレクトリ名を取得したい
-
CSVが可変長の場合の検索方法
-
DOSコマンドで、標準出力を出力...
-
open中のファイルをrename
-
FindFirstFileとFindNextFileで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル出力をUTF8Nではなくて...
-
Perl cgiの文字化けを直したい ...
-
HTTP::Request::Common qw(POST...
-
Perl utf8上でshiftjisをデコード
-
perlでuse utf8でsjisのファイ...
-
【エラー】Unrecognized character
-
perlで新規ファイルを作成でき...
-
utf-8のCSVをshift_jisに変換し...
-
Perl 正規表現について
-
Data::Dumper;でダンプ後表示し...
-
does not map to shiftjis は解...
-
perlをwindows環境でshift-jis...
-
Perl:Unicodeプロパティ作れない
-
perlのmysqlで文字化けをする、...
-
Perl出力をUTF-8に指定する方法
-
消費税の計算で 税込価格から...
-
[Perl]Shift-JISのXMLを解析する場
-
perl5.8.3のunicode環境で日本...
-
perlのLWP::Simpleでgrepの値が...
-
Perl UTF8で出力
おすすめ情報