• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:utf8フラグ落してもwide character)

ExcelファイルをCSVに変換する方法

このQ&Aのポイント
  • Excelファイルの全シートをCSV形式に変換する方法についてご教示ください。
  • Excelファイルのシートを一つずつ読み込み、各セルの値をCSV形式で出力する方法を知りたいです。
  • UTF-8エンコーディングのExcelファイルを読み込んで、CSV形式に変換する際に文字化けしない方法を教えてください。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.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.html#encode

ng999
質問者

お礼

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

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

関連するQ&A

  • Spreadsheet::WriteExcelについて教えてください。

    Windows2000 IE6.0 Perl5.005_03 Spreadsheet-WriteExcel-0.33 Parse-RecDescent-1.80 質問ですが、CGIとして実行すると「サーバーが見つかりません」 になってしまいます。エクセルファイルは正常に作成はできているようです。 use Spreadsheet::WriteExcel;をコメントにして実行すると移動したいURLに 飛ぶことができるのですが、当然ながらEXCELファイルは作成されません。 どのようにしたらよいのでしょうか・・・ print "Location: 移動したいURL\n\n"; print '<html><body>'; print '<br><br>'; print '<table align = "center">'; print '<tr>'; print '<td><font size = 5 ; color = blue>'; print "EXCEL書き出し"; print '</font></td>'; print '</tr>'; print '</table>'; print '</body></html>'; use Spreadsheet::WriteExcel; my $workbook = Spreadsheet::WriteExcel->new("perl.xls"); $worksheet = $workbook->addworksheet(); $format = $workbook->addformat(); $format->set_bold(); $format->set_color('red'); $format->set_align('center'); $col = 0; $row = 0; $worksheet->write($row, $col, "Hi Excel!"); $worksheet->write(1, $col, "Hi Excel!", $format); $worksheet->write(2, $col, 1.2345); $worksheet->write(3, $col, '=SIN(PI()/4)'); print 'Content-type: text/html' ."\n\n"; print <<EOF; <html><head><title>test</title></head><body>Ah!</body></head></html>

    • ベストアンサー
    • CGI
  • 今更ながらdbmopenでutf8環境にハマってます。

    今更ながらdbmopenでutf8環境にハマってます。 #!/usr/bin/perl use strict; use warnings; use utf8; use open ":utf8"; use open ":std"; my $key1='test'; my $key2='test2'; my $val1 = 'あああ'; my $val2 = 'いいい'; print "$key1 $val1\n"; print "$key2 $val2\n"; open(my$fh,">./utf8DB2"); print $fh "$val1\n"; print $fh "$val2\n"; close $fh; my %HASH; dbmopen(%HASH, 'utf8DB', 0666); #utf8::decode($val1) if utf8::is_utf8($val1); #utf8::decode($val2) if utf8::is_utf8($val2); #下記2行が無いとWide character in null operation at ... utf8::encode($val1)if utf8::is_utf8($val1); utf8::encode($val2)if utf8::is_utf8($val2); $HASH{$key1}="$val1"; $HASH{$key2}="$val2"; dbmclose(%HASH); my%DBM; dbmopen(%DBM,'utf8DB',0666); while ( my( $key , $val ) = each %DBM ){ #utf8::decode($val) if utf8::is_utf8($val); #utf8::encode($val) if utf8::is_utf8($val); print "key1 : $key 値 : $val\n" ; } foreach my$key ( keys( %DBM ) ) { #utf8::decode($DBM{$key}) if utf8::is_utf8($DBM{$key}); #utf8::encode($DBM{$key}) if utf8::is_utf8($DBM{$key}); print "key2 : $key 値 : $DBM{$key}\n"; } dbmclose(%DBM); 上記スクリプトを実行時、値を表示する際に文字化けしているのですが、これは、dbmopenで保存時既に文字化けしているのでしょうか、それとも表示する際、適切にエンコードorデコード出来てないから文字化けしているのでしょうか。 また、どのようにすれば解決可能かご教授願えませんでしょうか。 いっその事、DataDumperで保存し、読み出すように修正しようかとも思うのですが、tieに変更した場合も、同様に文字化けするのでしょうか・・ その辺りも含め、アドバイス他ご教授願えますと助かります。

    • ベストアンサー
    • Perl
  • Spreadsheet::ParseExcel+正規表現?

    Excelファイルを読み込んで、A列をずら~っと上から連続して表示するプログラムを作ったのですが(下記)、句読点の"。"が入ったセルで改行したいです。しかし、うまくいきません。文字コードが原因なのかな・・・と思ってはいるのですが・・・調べても調べてもわかりません。どうか、未熟者にアドバイスお願いします。 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ #! /usr/bin/perl # モジュールの読み込み use strict; use utf8; use Spreadsheet::ParseExcel; use Spreadsheet::ParseExcel::FmtJapan; # ? binmode STDOUT, ":utf8"; # Excelファイルの処理 my $format = new Spreadsheet::ParseExcel::FmtJapan; my $excel = new Spreadsheet::ParseExcel; my $book = $excel->Parse("xlsファイルの場所"); my $sheet = $book->{"Worksheet"}[0]; my $MaxRow = $sheet->{"MaxRow"}; my $MaxCol = $sheet->{"MaxCol"}; for(my $col=0, my $row=0; $row<=$MaxRow; $row++){ my $cell = $sheet->{"Cells"}[$row][$col]; my $val = ""; if($cell){ $val = $cell->Value; } print "$val"; if($cell=~"。"){ print "\n\n"; } } print "\n";

    • ベストアンサー
    • Perl
  • {ブロック}の外でのみ use utf8; したいのだが・・・

    連投申し訳ありません。 「まるごとPerl」(2006年9月、インプレス刊)という本の「まるごとEncode」という記事に従ってEncodeの勉強をしています。 原記事は UNIX(というか端末コードをUTF-8に出来る環境)ですが、それをWindowsに移植しようとして苦労しています。 #! perl # list3 -- UTF-8モードとバイトモードの切り替え #      インデントを表現するために全角空白を使っています use strict; use warnings; binmode STDOUT, ':encoding(cp932)'; # 追加 # ブロックの外側ではUTF-8文字単位で解釈される use utf8; {  # ブロックの外側ではバイトモードが強制される  use bytes;  my $text = '漢字、カタカナ、ひらがなの混じったtext';  print Encode::decode('UTF-8', substr($text, 9, 12)); # カタカナと表示されたい } my $text = '漢字、カタカナ、ひらがなの混じったtext'; print substr($text, 3, 4); # カタカナと表示されたい __END__ というプログラムを実行すると C:\>list3.pl カタカナカタカナ と表示されてほしいのですが、 C:\>list3.pl Cannot decode string with wide characters at C:/strawberry/perl/lib/Encode.pm li ne 174. と表示されます。 use utf8 を後ろにズラして #! perl # list3 -- UTF-8モードとバイトモードの切り替え #      インデントを表現するために全角空白を使っています use strict; use warnings; binmode STDOUT, ':encoding(cp932)'; # 追加 {  # ブロックの外側ではバイトモードが強制される  use bytes;  my $text = '漢字、カタカナ、ひらがなの混じったtext';  print Encode::decode('UTF-8', substr($text, 9, 12)); # カタカナと表示されたい } # ブロックの外側ではUTF-8文字単位で解釈される use utf8; # 移動 my $text = '漢字、カタカナ、ひらがなの混じったtext'; print substr($text, 3, 4); # カタカナと表示されたい __END__ とするとうまく動いて C:\>list3.pl カタカナカタカナ と表示されます。 #! perl # list3 -- UTF-8モードとバイトモードの切り替え #      インデントを表現するために全角空白を使っています use strict; use warnings; binmode STDOUT, ':encoding(cp932)'; # 追加 # ブロックの外側ではUTF-8文字単位で解釈される use utf8; my $text = '漢字、カタカナ、ひらがなの混じったtext'; # 移動 print substr($text, 3, 4); # カタカナと表示されたい # 移動 {  # ブロックの外側ではバイトモードが強制される  use bytes;  my $text = '漢字、カタカナ、ひらがなの混じったtext';  print Encode::decode('UTF-8', substr($text, 9, 12)); # カタカナと表示されたい } __END__ のようにするとやはり最初と同じエラーになりますが、 #! perl # list3 -- UTF-8モードとバイトモードの切り替え #      インデントを表現するために全角空白を使っています use strict; use warnings; binmode STDOUT, ':encoding(cp932)'; # 追加 # ブロックの外側ではUTF-8文字単位で解釈される use utf8; my $text = '漢字、カタカナ、ひらがなの混じったtext'; # 移動 print substr($text, 3, 4); # カタカナと表示されたい # 移動 no utf8; # 追加 {  # ブロックの外側ではバイトモードが強制される  use bytes;  my $text = '漢字、カタカナ、ひらがなの混じったtext';  print Encode::decode('UTF-8', substr($text, 9, 12)); # カタカナと表示されたい } __END__ だと大丈夫です。 結果として、ブロックの外で use utf8;、中では use bytes; という記事の著者の意図通りに動作しないようで、ブロックの中まで use utf8; が効いているようです・・・。 これは Perl の実装が変わったのでしょうか。 使用しているのは Windows XP Home SP3+Strawberry Perl v5.10.0 です。

    • ベストアンサー
    • Perl
  • 文字コードの変換(Shift-JISからUTF8)

    文字コードがShift-JISのCSVファイルを読み込み、UTF-8のテキストファイルに出力するのに プログラムの中で変更しようとしているのですが、うまくいきません。出力ファイルの文字コードを 確認するとShift-JISのままです。 どなたか教えていただけないでしょうか? ActivePerl v5.16.0を使用し、Encodeモジュールのfrom_toを使用しています。 #!/usr/bin/perl use strict; use warnings; use utf8; use Encode; my $input_file="input.csv"; my $output_file="output.txt"; open (IN, $input_file) or die "$!"; open (OUT, ">$output_file") or die "$!"; while (<IN>){ chomp ($_); my @data=split(/,/,$_); for(my $i=0;$i<@data;$i++){ $data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換 $data[$i]=~s/\s+//g; print OUT $_; } print OUT "\n"; } close (IN); close (OUT);

    • ベストアンサー
    • Perl
  • Perl+UTF8で文字化け

    以下の環境にてメール送信プログラムを作成していますが、 ありがちな文字化け、且、ボディーが表示されない不具合が発生しています。 サーバ:linux apache レンタルサーバ ※Encode.pm、Jcode.pm無し。モジュールインストール不可。 Perl version: 5.006001 ソースエンコード:utf-8 自分の解釈としてはutf8で記述しているので、 charset=utf-8にしておけば、 MIMEエンコードさえしてやれば 表示できると考えているのですが、 やはり甘い考えなのでしょうか? また、同サイト質問NO2868794も参考にさせていただきましたが、上手くいきません。 以下ソース(エンコード:utf-8) use utf8; use MIME::Base64; use POSIX; ※アドレス表記はこのサイトの投稿チェックに引っかかるので省略します。 my $to = 'XXXX@XXXX'.XXX; my $from_nm = "送信者名"; my $from_adr = "XXXXX@XXX.XXX"; my $subject = "メール表題"; my $body = "本文"; # 送信者名を MIME エンコード encode_base64($from_nm,""); # subjectを MIME エンコード encode_base64($subject,""); $subject = "=?utf-8?B?" . $subject . "?="; # 本文を MIME エンコード encode_base64($body); my $MailPass = "XXXX/XXXX/XXX"; #SendMail Pass open(MAIL,"| $MailPass -t"); #======================================================== print MAIL <<"EOF_MAIL"; From: $from_nm<$from_adr> To: $to Subject: $subject Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 MIME-Version: 1.0 $body EOF_MAIL #======================================================== close MAIL; その他、色々ググっては見たのですが、自分ではみつけられず、 どうかアドバイスありましたらよろしくお願いいたします。

  • Cannot decode string with wide characters

    use utf8; binmode STDOUT, ':utf8'; binmode STDIN, ':utf8'; use strict; use Encode; sub main(){ #UTF-8(BOMなし),CRLFのファイルに書いてます。 my $str = "あ"; my $bin = $str; $bin = Encode::encode('euc-jp', Encode::decode('utf8', $str)); $bin = Encode::encode('utf8', Encode::decode('euc-jp', $bin)); print "Content-Type:text/plain;charset=UTF-8\n"; print "\n"; print $bin; } &main; ======================= 希望する出力結果: あ ============================ 結果:Internal Server Error Apacheのエラーログ: [Wed Jan 09 15:07:34 2008] [error] [client 127.0.0.1] Premature end of script headers: 20080109-1.pl [Wed Jan 09 15:07:34 2008] [error] [client 127.0.0.1] at C:/Environment/Perl/v5.8.8/lib/Encode.pm line 166.\r ========================= 質問: どのように修正すればよいか?

  • utf8使用時のフォーム入力文字コード

    use utf8; binmode(STDIN,":encoding(shiftjis)"); をすると、入力時に内部変換がかかり、UTF-8として扱える という認識で使っていたのですが、下記のコードを実行してみると 入力した文字は普通に sjisで表示されます。 binmode(STDIN~ はどのような意味を持つのでしょうか。 http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html http://www.hikoboshi.org/perl/doc/encode.html 他、いろいろなサイトで調べてみたのですが、いまひとつ 納得する回答を得ることができません。 //////////////////////////////////////////////////// use utf8; use open 'encoding(utf8)'; binmode(STDIN,":encoding(shiftjis)"); use CGI; print "content-type:text/html; charset=Shift_JIS \n\n"; print <<"EOM"; <form action="xxx.cgi"> <input type="text" name="hoe"> <input type="submit"> </form> ここは UTF-8文字列なので化ける<br> EOM $cgi = CGI->new; print $cgi->param('hoe'); //////////////////////////////////////////////////// 現在は下記のコードで自前で UTF-8に変換しています //////////////////////////////////////////////////// foreach( $cgi->param() ){ my $str = $cgi->param($_); $str = Encode::encode('utf-8', Encode::decode('shiftjis', $str)); $cgi->param( -name=>$_, -value=>$str ); }

    • ベストアンサー
    • Perl
  • Spreadsheet::ParseExcelの空の行の値

    Spreadsheet::ParseExcelを使っていてよくわからないところがあったので、ご教授お願いします。 Excelの空のセルを正規表現でマッチさせるにはどうすれば良いのでしょうか? ***************************** use strict; use utf8; my cell = $sheet->{"Cells"}[$row][$col]; my val = ""; if($cell){ $val = $cell->Value; } if($val =~ "???"){ print "空のセルです"; }

    • ベストアンサー
    • Perl
  • ~文字が認識されない?

    ActivePerl5.8.8 です。 sjisのファイルを読み込んで、utf8で出力しています。 +++++++++++++++++++++++++++++++++++++++++++ open (IN, '<', ${filename}); my $contents = do { local $/; decode('shiftjis', <IN>)}; close IN; open OUT, '>', "${out}.txt"; print OUT encode('utf8', ${contents}); close OUT; +++++++++++++++++++++++++++++++++++++++++++ "~"というsjisの記号文字が"?"となって出力されてしまいます。 "~"のまま出力する方法がありましたら教えてください。

    • ベストアンサー
    • Perl