電子書籍の厳選無料作品が豊富!

毎度ご迷惑をおかけしております

http://idsc.nih.go.jp/idwr/CDROM/Kako/H18/Syuuke …

というExcelファイルの全sheetを.csvに吐き出そうと思い、OKwaveでコードを教えてもらいました

しかし Wide character in printという警告が出て文字化けしました。

そこでまたOKwaveで聞いたところ、

http://www.rwds.net/kuroita/program/Perl_unicode …
というURLを教えてもらいました。

これに従って(?)、理屈はわからないながら utf8フラグが立っていたら落とすというような
コードにしてみましたが、やはり文字化けします。

全く原理ができておらず、誠にお恥ずかしい限りですが、
どのようなコードを書けばよいか、ご指導よろしくお願い申し上げます。

以下、だめだったコードです(改悪は私です)。
#########################################################################
use Spreadsheet::ParseExcel;
#use Encode qw/ encode decode/;
use Encode;

my $sFN = "Syu_08_1.xls";

my $filename = $sFN;
print "filename: $filename\n";

my $parser = Spreadsheet::ParseExcel->new();
my $workbook = $parser->parse( $filename );
if ( !defined $workbook ) { die "Parsing error: ", $parser->error(), ".\n"; }
my $sRT = '';
## シートの数だけ繰り返し
for my $worksheet ( $workbook->worksheets() ) {
print OUT "*";
my ( $row_min, $row_max ) = $worksheet->row_range();
my ( $col_min, $col_max ) = $worksheet->col_range();
foreach my $nLineY ( $row_min .. $row_max ) {
my $rec = "";
foreach my $nLineX ( $col_min .. $col_max ) {
my $cDT = $worksheet->get_cell($nLineY,$nLineX);
## セルにデータが在ったときの処理
if ( $cDT ) {
$sTMP = $cDT->value();
$sTMP =~ s/,//g;
if ( utf8::is_utf8($sTMP) ){ # utf8フラグがたっていたら
print "utf flag on: $sTMP\n";
utf8::encode($sTMP);  # utf8フラグを落とす
}
$rec .= "$sTMP,";
}
}
print "$rec\n";
}
}

A 回答 (1件)

最終的にどの文字コードにしたいのでしょうか?


そのCSVはどのように確認したのでしょうか?

utf-8フラグを落した文字列を出力すれば、そのファイルのコードはUTF-8になります。
CSVを確認したのが Excelだとすると、そのままでは文字化けします。

他のUTF-8に対応したテキストエディアで確認すれば、文字化けしていないと思います
(メモ帳ではだめです)

ExcelではUTF-8のcsvを読もうとすると、文字化けすることがあります。
これは、Excelでは、Shift_JISだと勝手に解釈するからです。
これを避けるには
・BOM付きのUTF-8でCSVを記述する
・Shift_JISでCSVを記述する
となります。

後者の場合、encodeを使ってShift_JISに変換します。このときに、UTF8フラグも落してくれます。
http://www.rwds.net/kuroita/program/Perl_unicode …
    • good
    • 0
この回答へのお礼

おっしゃるとおりです!
秀丸エディタで開けると読むことができ、コードはUTF8になっていました。shift jisで保存するとExcelでも読めました。

大変たすかりました。

お礼日時:2013/03/05 09:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!