【Excel】Spreadsheet::ParseExcelと正規表現を使ってExcelファイルからA列を連続して表示する方法

このQ&Aのポイント
  • Excelファイルを読み込んで、A列を連続して表示するプログラムを作成しました。しかし、句読点の「。」が入ったセルで改行したいですが、うまくいきません。
  • 文字コードが原因かどうか調べましたが、わかりません。未熟者の私にアドバイスをお願いします。
  • PerlのSpreadsheet::ParseExcelモジュールと正規表現を使ってExcelファイルのA列を連続して表示する方法について教えてください。
回答を見る
  • ベストアンサー

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";

noname#105753
noname#105753
  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
回答No.1

Spreadsheet::ParseExcelの内容を知りませんが、perlでのプログラミングでは随所で小さなテストプログラムを作って確認を怠らない必要があると思っています。(←怠ったために、何度かはまっています) ところで if($cell=~"。"){ で、あっていますでしょうか? if($val=~"。"){ ではないのでしょうか? パターンマッチの判定部分では、「。」を含む文字コードは無関係のようです。 たとえば、perl単体 (v5.6.1 built for MSWin32-x86-multi-thread)で === @a = ("あいうえお。","かきくけこ","さしすせそ。","たちつてと"); foreach $i (@a) { print "$i"; if ($i =~ "。") { // or $i =~ /。/ print "\n"; } } === を実行すると === あいうえお。 かきくけこさしすせそ。 たちつてと === となります。

noname#105753
質問者

お礼

すみません、少し複雑に考えすぎていたようです・・・。そのものズバリの回答でした。ご指摘ありがとうございました!

関連するQ&A

  • 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
  • Spreadsheet::ParseExcelを使ってみたいのですが・・・

    CPANのモジュールよりエクセルからデータを読み込むものがあったので、ぜひつかってみたかったのですが、使い方がよくわかりません。 いろいろ調べまして、とりあえず、下記のようなできあがったサンプルを実行してみたのですが、 ------------------------------------------------------------------ use strict; use Spreadsheet::ParseExcel; my $oExcel = new Spreadsheet::ParseExcel; #1.1 Normal Excel97 my $oBook = $oExcel->Parse('Excel/Test97.xls'); my($iR, $iC, $oWkS, $oWkC); print "FILE :", $oBook->{File} , "\n"; print "COUNT :", $oBook->{SheetCount} , "\n"; print "AUTHOR:", $oBook->{Author} , "\n"; for(my $iSheet=0; $iSheet < $oBook->{SheetCount} ; $iSheet++) { $oWkS = $oBook->{Worksheet}[$iSheet]; print "--------- SHEET:", $oWkS->{Name}, "\n";S for(my $iR = $oWkS->{MinRow} ; defined $oWkS->{MaxRow} && $iR <= $oWkS->{MaxRow} ; $iR++) { for(my $iC = $oWkS->{MinCol} ; defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol} ; $iC++) { $oWkC = $oWkS->{Cells}[$iR][$iC]; print "( $iR , $iC ) =>", $oWkC->Value, "\n" if($oWkC); } } } ------------------------------------------------------------------ 下記のエラーがでてしまいます。 Can't locate Spreadsheet/ParseExcel.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) at excel.txt line 2. BEGIN failed--compilation aborted at excel.txt line 2. 現状はC:\Perl\cpan\build\Spreadsheet-ParseExcel-0.30 というディレクトリにモジュールのフォルダがインストールされるところまではできたのですが、後何が必要なのか、もしくはどこがおかしいのか、見当もつきません。 どなたか教えていただけますでしょうか。 ちなみにwindowsで動かしており、active perlをインストールして、 コマンドプロンプトでやっています。

  • 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
  • utf8フラグ落してもwide character

    毎度ご迷惑をおかけしております http://idsc.nih.go.jp/idwr/CDROM/Kako/H18/Syuukei/Syu_08_1.xls というExcelファイルの全sheetを.csvに吐き出そうと思い、OKwaveでコードを教えてもらいました しかし Wide character in printという警告が出て文字化けしました。 そこでまたOKwaveで聞いたところ、 http://www.rwds.net/kuroita/program/Perl_unicode.html#widechar という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"; } }

    • ベストアンサー
    • Perl
  • 今更ながら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
  • 正規表現の書き方に困っております。

    あるSQLのダンプを変換するプログラムをPerlで書いているのですが、 うまく正規表現が書けなくて困っております。 データの途中に,が有ると、うまくいきません。 ''の中に囲まれた,は無視するという正規表現を書きたいのです。 また、'''B'も正しく処理できれば、完璧です。 #!/usr/bin/perl use strict; use warnings; #my $a = qq{'A','B',1}; --> うまくいく  ['A']['B'][1] #my $a = qq{'A,','B',1}; --> うまくいかない ['A] ['] ['] my $a = qq{',','''B',1}; --> もっとうまくいかない ['][']['] if($a =~ /(.+?),(.+?),(.+?)/){ print "[$1]\n"; print "[$2]\n"; print "[$3]\n"; }else{ print "ERR!\n"; } exit; __END__

    • ベストアンサー
    • Perl
  • Perl 正規表現について

    Perlに関していつもお世話になっております。 今回も正規表現に関する質問をしたいと思います。 「あ、あい、あいう、あいうえ、あいうえお」というハッシュが存在するときに、「{あ}は○○回出ました。」「{あい}は○○回出ました。」とそれぞれ表示させるコードを組もうと思います。 前回までで皆様に教えていただいたことを元に組んでみました。 #!/usr/bin/perl use warnings; use strict; use utf8; use Encode; my %word_of = ( 'あい' => 0, 'あいう' => 0, 'あいうえ' => 0, 'あいうえお' => 0, 'かき' => 0, 'かきく' => 0, 'かきくけ' => 0, 'かきくけこ' => 0, ); foreach my $search_key ( keys %word_of ) { foreach my $word ( keys %word_of ) { if ( $word =~ /$search_key/ ) { $word_of{$search_key}++; } } } foreach my $key ( sort ( keys %word_of ) ) { # utf8, shiftjis eucjp ... print encode( 'utf8', "「$key」 は $word_of{$key} 回出ました" ), "\n"; } これを出来ればeucjpで組みたいのですが、可能でしょうか? 私の思いあたる点、utf8表記の部分をeucjpに直しただけではエラーが出てしまいます。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • utf-8での日本語正規表現の書き方

    WindowsXPでPerlの正規表現の勉強をしています。 下記のスクリプトを作りテストしているのですが例1はマッチするのに例2はマッチしません($countが0のままです)。どうしてなのでしょうか?なおスクリプトファイルも、hoge.txtも共にUTF-8です。どなたかお教えいただけますでしょうか。どうぞよろしくお願いします。 use utf8; use encoding ("utf-8"); # 例1################################## $str1 = "そろそろ夏も終わりですね。"; $str2 = "夏"; if ($str1 =~ /夏/) { print "例1の答え: 含まれています \n"; } else { print "例1の答え: 含まれていません \n" } # 例2 ################################### $count = 0; open(FH, "C:\\temp\\hoge.txt"); while(<FH>) { if (/夏/) { $count++; } } print "$count \n";

    • ベストアンサー
    • Perl
  • エクセルのセルからのデータ取り込み

    取り込んだセルのデータを使いたいのですが。。。 特定のセルの指定方法がわるのでしょか? ここが悪いと思ってますが、 ↓ print "$arrary[0][0]\n"; -------------------------------------------------------------- use strict; use Win32::OLE qw(in with); use Win32::OLE::Const 'Microsoft Excel'; $Win32::OLE::Warn = 3; # die on errors... my $Excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit'); # get already active Excel # application or open new my $Book = $Excel->Workbooks->Open("C:\\DOCUMENTS\\test.xls"); # Excelのファイルをオープン my $Sheet = $Book->Worksheets(1); # ワークシート1を選択 my $array = $Sheet->Range("A8:B9")->{'Value'}; # 中身を取り出す $Book->Close; print "$arrary[0][0]\n";

  • SpreadSheet::ParseExcelで取得できない文字について

    Spreadsheet::ParseExcelでExcelから取得できない文字があります。 取得できない文字: 1.前腸 2.胚 3.葯 4.優性 情報をお持ちの方がいらっしゃいましたら宜しくお願いいたします。 環境はSolaris10でPerl5.8.4です。 以下のように取得時のフォーマットをFmtJapanにて指定しています。 my $oFmtJ =Spreadsheet::ParseExcel::FmtJapan->new(Code => 'euc'); わかっていること・・ 1)文字コードをeucとすると1から4まで全て取得できません。 2)文字コードをsjisとすると2、3が取得できません。 3)文字コードをutf8とすると1のみが取得できません。 1から4まで全て取得したいです。

専門家に質問してみよう