• ベストアンサー

PerlでCSVファイルからRSS対応のXMLファイル(UTF-8フォーマット)を作成する方法を教えて下さい。

初めてOKWebを使わせて頂きます。よろしくお願い致します。 社内でホームページを作成しており、新着情報などはCSVファイル(日付、タイトル、内容、URLなどが一行に記載されたもの)を元にPerlプログラムでホームページに表示するようにしています。 このCSVファイルを使って、RSS対応のXMLファイルを生成したくPerlでCSVファイルからXMLファイルを作成するプログラムを記述してみたのですが、作成後、UTF-8フォーマットでファイルを保存する方法がわかりません(現在はShift-JISになっていると思います)。 ファイルをUTF-8に変換し保存するPerlの記述方法がわかりましたらお教えください。 尚、環境は以下となります。 OS:Windows2000Server Web:IIS5.0 ソフト:ActivePerl5.6 他の人が作ったPerlプログラムもあり、できればこの環境(Versionなど)は変えずできると嬉しいです。Perl初心者ですので、できれば具体的な記述方法をお教え頂ければとても助かります。申し訳ありませんが、よろしくお願いします。

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

  • ベストアンサー
  • hok212
  • ベストアンサー率66% (100/150)
回答No.2

ActivePerl5.6系で日本語をUTF-8に変換するにはJcode.pmが必要になります。 もし、Jcode.pmがインストールされてないのでしたら ppm コマンドでインストールしてください。 ------------------- ppm コマンドの使い方 ----------------------- 1. コマンドプロンプトを起動 2. ppmコマンドを入力しPerlPackageManagerを起動 3. ppm> install Jcode エラーが出なければインストール完了 ---------------------------------------------------------------- さて文字コードの変換ですが、ファイルはすでにShift_JISで作成できていると言うことですので 次のようなPerlスクリプトはいかがでしょう? use Jcode; $baseFile = "sjis.txt"; # Shift_JIS $revFile = "utf8.txt"; # utf-8 open(FH,$baseFile); @lines = <FH>; close(FH); foreach (@lines) { $line .= Jcode->new(\$_,'sjis')->utf8; } open(FH,">$revFile"); print FH $line; close(FH); ※ ファイルをわざわざopenしないで変換する方法があるのでしょうが、私は上記のような泥臭い手法しか知りません ^^;

f-kaz
質問者

お礼

ご回答ありがとうございます! PPMコマンドの使い方も記述方法も具体的に書いて頂きありがとうございました! 初心者の自分にはとても助かります。 上記試したのですが、サーバのDosプロンプトででppm>install Jcodeを実行すると Error installing package 'Jcode': Could not locate a PPD file for package Jcode と出てしまいます。PPDファイルを置く場所の設定?もしくはイントラネットの環境に問題があるのかもしれません。初心者ですので、まだここから進めずです。 Jcodeのインストールがうまく行きましたら上記の書き方を是非使わせて頂きます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

私は、5.8を使ってて5.6でできるかどうかちょっと自信がないので、 他の安易な方法として XML宣言部分を <?xml version="1.0" encoding="Shift_JIS"?> にしておけば、シフトJISのままでいいかと思います。 また、メモ帳なんかを使えば名前を付けて保存で、UTF8で保存できたと思うので Perlスクリプト自体をUTF8で書くと出力もUTF8になると思います。(その場合読み込むCSVもUTF8にしておく) 環境を変えられないということですが、 Perl5.8以降とか XML::RSSなんかを使うと楽できますよ

f-kaz
質問者

お礼

ご回答ありがとうございます! XML宣言部分の変更でうまく行きました!なるほど~。 Perl5.6と5.8以降では大きな違いがあるのでしょうか? 昔環境がActivePerl5.18から5.22へ変更された時に、一部のプログラムが動かなくなったことがあり、また自分だけの環境でもないので不安があります。でも5.8以降にした方が良さそうですね。XML::RSSも使ってみたいです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • プロキシ経由でRSSのデータをCSVに変換するものを作成したい

    Perl5.6を使っております。 use XML::RSS; モジュールの利用を考えております。 プロキシ経由でRSSのデータをCSVに変換するものを作成しようと考えております。 何か良いサンプルは有るのでしょうか?

    • ベストアンサー
    • Perl
  • UTF16のCSVファイルをUTF8に変更する方法

    仕事でUTF16のCSVファイルをUTF8に変換する必要があって調べています。 秀丸やフリーソフトなら可能なのですが、お客さんに極力操作させたくないので、バッチファイルで呼び出せたらいいと考えています。 JAVAを使った、UTF16で読み込んでUTF8で書き出すプログラムというのも思いついたのですが、処理速度が懸念材料です。 上記以外の方法で、文字コード変換を行う方法をご存知でしたら、教えてください。

  • PerlでRSS取得 ~ 文字化け ~ utf8→ShifJIS変換できない

    XML::RSSを使用してRSSのタイトルを取得するPerlスクリプトを作っています。 DBCSの場合、文字化けするので、以下のようにfrom_toを使用してutf8をShiftJISに変換しようとしましたが、エラーが出ます。 SBCSでは問題無いのですが。 Encode::Guessで調べるとutf8が返ってくるので、「from_to( $title, 'utf8','shiftjis' )」でutf8をShift-JISに変換すればよいのかと思ったのですが。 ■環境 ・perl v5.8.3 built for MSWin32-x86-multi-thread ・Windows2000(SP4) ■エラーメッセージ Cannot decode string with wide characters at c:/Perl/lib/Encode.pm line 184. ■ソース #!/usr/bin/perl BEGIN { use CGI::Carp qw(carpout fatalsToBrowser); carpout(STDOUT); } use Encode qw/ from_to /; use LWP::Simple 'get'; use XML::RSS ; print"Content-type: text/html\n\n"; print"<HTML>\n"; print"<HEAD><meta http-equiv=\"Content-Type\" content=\"text/html;charset=Shift-JIS\"></HEAD>\n"; print"<BODY>\n"; my $rss = new XML::RSS; eval {   # $rss->parse( get('http://slashdot.org/slashdot.rdf') );    $rss->parse( get('http://oshiete1.goo.ne.jp/rss/oshiete_goo.xml') ); }; exit if $@; foreach my $ref( @{$rss->{items}} ) {   $title = $ref->{'title'};   $link = $ref->{'link'};   from_to( $title, 'utf8','shiftjis' );   print"[title] $title<br>\n";   print"[link] <a href=\"$link\" target=\"_blank\">$link</a><br>\n";   ----------------------------<br><br>\n"; } print"</BODY></HTML>\n"; RSSの取得方法はここを参考にしました。 http://www.rfs.jp/sb/perl/10/rss01.html 宜しくお願いします。

    • ベストアンサー
    • Perl
  • UTF-8のXMLファイルをAccessで取り込みたい

    まずはOpenステートメントでそのXMLファイルを開き、なんとかしてUTF-8のXMLファイルをUnicodeに変換し、そこからstrConv関数でS-JISに変換したいのですが、 どのようなコードを書いてよいのかがわかりません。 UTF-8をS-JISに変換できるような、便利なプロシージャを教えていただけないでしょうか? もちろん、UTF-8→Unicode→S-JIS というステップを 踏まなければならないかと思いますが、、、 何かいい方法あれば是非教えてください!

  • perlで新規ファイルを作成できない(文字化け)

    下記、PERLスクリプトを Windows 7+ActivePerl + UTF-8記述状態 で使いたいのですが、どうやら、「爱」が正常に変換されず、?という文字が発生しファイルの作成ができないようです。 普通に、Windows 7上で、$titleの爱愛aiをコピーしてファイルの作成はできるので、Perl上でもこの動作を何とか実現させたいのですが、どのようにすればいいでしょうか? ---test.pl(utf8記述)--- use strict; my $title = "爱愛ai"; # 念のためURLエンコードした物も書いておきます>%E7%88%B1%E6%84%9Bai use Encode; Encode::from_to($title, "utf8", "cp932"); open(F,">$title"); print F $title; close(F); open(F,">title_test.txt"); print F $title; close(F); -------------------------------

    • ベストアンサー
    • Perl
  • 自作RSSファイルを作成したのですが、受信可能な状態にするにはどうすれ

    自作RSSファイルを作成したのですが、受信可能な状態にするにはどうすればいいのでしょうか。 形式はXMLドキュメントです。 このRSSは、自分のホームページではなく他人のブログの更新を知らせるよう設定したものです。 ブラウザはoperaを使っています。 よろしくお願いします。

  • UTF-8のCSVファイルを開く

    エクセル2000でUTF-8の文字コードで作られたCSVファイルを開くと 文字化けしてしまいます。  文字化けせずに開く方法を御存知の方、教えてください。  VBAを使う方法でも構いません。(コードを教えてください。) 宜しくお願いします。 以上

  • PerlによるXMLからCSVへの変換について

    Perl初心者です。 下記のようなXMLファイル(test.xml)を、CSVに変換したいと考えています。 <MODESMESSAGE> <DATETIME>20121129045500</DATETIME> <MODES>8515C4</MODES> <CALLSIGN>JAL1406</CALLSIGN> <ALTITUDE>03075</ALTITUDE> <GROUNDSPEED>177</GROUNDSPEED> <TRACK>330</TRACK> <VRATE>-832</VRATE> <AIRSPEED>000</AIRSPEED> <LATITUDE>35.4003</LATITUDE> <LONGITUDE>139.8822</LONGITUDE> <SQUAWK>3341</SQUAWK> </MODESMESSAGE> <MODESMESSAGE> <DATETIME>20121129045500</DATETIME> <MODES>86CF11</MODES> <ALTITUDE>20100</ALTITUDE> <VRATE>0</VRATE> <AIRSPEED>000</AIRSPEED> <LATITUDE>0</LATITUDE> <LONGITUDE>0</LONGITUDE> </MODESMESSAGE> データによって、要素が欠けている場合もありますが、最大で11個の要素が並んでいます。 これをCSVに変換するため、書籍を参考にしながら以下のスクリプトxml2csv.plを作りました。 使用している環境はLinuxです。 use encoding "utf8", STDOUT=>"Shift_JIS"; use XML::Parser; $parser = new XML::Parser( Handlers => {Start=>\&element_start, Char => \&cdata, End => \&element_end}); $element_name = ''; %records = {}; eval ( "\$parser->parsefile( \@ARGV[0] );"); if ($@) { chomp($@); $@ =~ s/^\n//; $@ =~ s/ at (?:[A-Z]:)?\/.*//; print @ARGV[0] . " :Error $@ \n"; } sub element_start { my ($expat, $name, %attributes) = @_; $element_name = $name; $records = {} if ( $name eq 'MODESMESSAGE' ); } sub element_end { my ($expat, $name) = @_; if ( $name eq 'MODESMESSAGE' ) { print $records{'DATETIME'} . "," . $records{'MODES'} . "," . $records{'CALLSIGN'} . "," . $records{'ALTITUDE'} . "," . $records{'GROUNDSPEED'} . "," . $records{'TRACK'} . "," . $records{'VRATE'} . "," . $records{'AIRSPEED'} . "," . $records{'LATITUDE'} . "," . $records{'LONGITUDE'} . "," . $records{'SQUAWK'} . "\n"; } $element_name = ''; } sub cdata { my ($expat, $context) = @_; $records{$element_name} = $context if ($element_name); } 実行すると、 > perl xml2csv.pl test.xml 20121129045500,8515C4,JAL1406,03075,177,330,-832,000,35.4003,139.8822,3341 test.xml :Error junk after document element at line 14, column 0, byte 345 > 上記の通り1つ目のデータについてはCSVに変換できているようなのですが、2つ目以降が変換されずエラーとなってしまいます。 お気づきの点がありましたら教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perlでgoogle newsのRSSを取得する方法を教えて下さい。

    Google NewsのRSS情報をperlで取得し、表示するプログラムを作っています。 が、他のサイトのRSS情報は容易に取得できるのに、Google Newsだけは、取得できません。 具体的には、、、 ----------------------------- #!/usr/local/bin/perl use LWP::Simple; use XML::RSS; my $url = 'http://news.google.com/news?hl=ja&ned=us&ie=UTF-8&oe=UTF-8&output=rss&q=aiko'; my $data_from_web = get($url); print <<"HTML"; Content-type: text/html <html> HTML print $data_from_web; print $url; exit; ----------------------------- ※URL部分が長すぎて一部省略されている様ですが、 あえて2行で書くと、こうなっています。 http://news.google.com/news?hl=ja&ned=us&ie=UTF-8 &oe=UTF-8&output=rss&q=aiko'; 上記の様な簡単なプログラムで、歌手aikoのニュースに関する RSS情報を取得し、表示できるはずなのですが、実行してみても、 何も表示されません。 ちなみに、my $urlの部分を他のURL、例えば、日刊ゲンダイ http://headlines.yahoo.co.jp/rss/gen_ent.xml に差し替えて実行してみると、きちんと表示されます。 また、ブラウザーのURLの窓に、直接、プログラム内の$url部分である http://news.google.com/news?hl=ja&ned=us&ie=UTF-8&oe=UTF-8&output=rss&q=aiko というURLを入れ、リターンキーを押すと、歌手aikoのニュースに関する RSS情報が直接ブラウザーで表示されます。 なのに、上記のプログラムでは表示されないのです。 (ブラウザー等の情報もPerlで送信しないとGoogle newsはRSS情報を送信してくれない?) どの様にしたら、perlでGoogle NewsのRSS情報を取得できるのか、 教えていただけたら幸です。 尚、参考にしたサイトは以下です。 Google news日本語版 http://news.google.com/news??hl=ja&ned=jp&ie=UTF-8&oe=UTF-8 Googleニュース日本語版のAtom/RSSフィード http://d.hatena.ne.jp/Gimite/20061205/1165287606 Googleニュース(日本語版)のRSSフィード http://blog.fkoji.com/2006/12091315.html Google News日本語版のRSSとAtomを取得してみるテスト http://ryouchi.seesaa.net/article/28534464.html PHPで実現しているGoogle NewsのRSS情報表示サイト http://www.usamimi.info/~ryouchi/googlenews/index.php Googleニュース用RSSジェネレータ http://g.1o4.jp/news-rss.html Google NewsがRSSフィードを採用  http://zen.seesaa.net/article/5748907.html RSSリーダーを使った情報収集術&便利なフィード7選 http://google-mania.net/archives/895 以上、よろしくお願い致します。

    • ベストアンサー
    • Perl
  • アメーバブログのxmlファイルの入手方法

    アメブロのxmlファイルを見ようとして 「XML RSS1.0」あるいは「XML RSS2.0」のアイコンをクリックしてみるとブラウザーが開きブログの内容が表示されます。ただ表示レイアウトなどをカスタマイズする必要があるため、XMLファイル形式(要素名を開始タグに記述し、終了タグとの間に内容が記述されている形式)でブログの内容を取得したいのですが、方法というかURLが分かりません。よろしくお願いします。

    • ベストアンサー
    • XML
このQ&Aのポイント
  • EP M553Tとew 052Aの黒の印刷のランニングコストを比較します。
  • EP M553Tはインクタンク方式でランニングコストが安く、ew 052Aと比べてどれぐらい変わるのか気になります。
  • EP M553Tを購入する際にランニングコストが気になりますが、黒の印刷だけならどのくらい変わるのか調べました。
回答を見る

専門家に質問してみよう