• ベストアンサー

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 "空のセルです"; }

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

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

パターンマッチにこだわるのなら "???" の部分は "^$" になるでしょう。 正規表現をネット検索すれば、代表的なパターンを見ることが出来ます。

noname#105753
質問者

お礼

ごめんなさい、自力で解決できました・・・。 if($b_val eq "")としたらOKでした、回答ありがとうございました。

noname#105753
質問者

補足

うーん、上手くいきません・・・。申し訳ありません。 ***************************** use strict; use utf8; for文でrow++、$row<=$MaxRowのループ my cell = $sheet->{"Cells"}[$row][$col]; ##A列の読み込み my b_cell = $sheet->{"Cells"}[$row][$col+1] ##B列の読み込み my val = ""; my b_val = ""; if($cell){ $val = $cell->Value; ##A列の$rowが読み込まれる } if($b_cell){ $b_val = $b_cell->Value; ##B列の$rowが読み込まれる } if($val =~ " "){ ##(""の中身は全角スペース) print "この分に関しては成功"; } elsif($val =~ "あ"){ print "この分に関しては成功"; } else{ if($b_val =~ " "){ ##(1)とする print "ここが失敗"; } else{ print "ここも失敗。(1)に当てはまるはずの値もすべてこちらに判断されてしまう"; } } ***************************** こういう感じなんです・・・。ちなむとFmtJapan使ってます。 出力された空のセルの$b_valが何もprintしなかったので、$b_val =~ ^$のほかに$b_val =~ ""というのも試してみましたが、それもダメでした。

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

関連するQ&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";

    • ベストアンサー
    • Perl
  • 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
  • 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を使ってみたいのですが・・・

    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をインストールして、 コマンドプロンプトでやっています。

  • VBAを使って条件付書式のセルを保護したい

    VBAを使って =A2<>0の条件付書式の入ったセルが 黒塗りのときをロックしたいと思い セルの状態を調べたいのですが FormatConditionsを使えばいいのかと想うのですが 使い方がイマイチわかりません。 たとえば 黒で塗りつぶしたセルを探そうと想ったときは locked_col = RGB(0, 0, 0) cell_col = Worksheets("Sheet1").Cells(j, i).Interior.Color 'セルが黒塗りの場合ロックする If Not cell_col = locked_col Then Cells(j, i).Locked = False End If っていう風にはできないのでしょうか? 知恵をおかしください

  • 言語ではなく、正規表現のみで複数の条件を記述する方法 ?

    一つの条件の正規表現は書けるようになりましたが、 条件が重なった場合の対処の仕方がわかりません。 my $val = "12"; #数字のみ if($val =~ /^[0-9]+$/){ # match! } #0で無い if($val !~ /^0$/){ # match! } # 数字で0でない <---複数条件 ? # 言語でカバーするのではなく、正規表現のみ(1つの正規表現) # でANDやORやXORができるパターンの記述方法が知りたいです。 if($val =~ /^[0-9]+$/) && ($val !~ /^0$/){ # match! }

    • ベストアンサー
    • Perl
  • Excel  VBAのマクロについて

    以下のようなマクロを作りました。 P4に開始番号P6に終わりの番号があるのですが、P4=P6、つまり、一つだけのシートを作成する分には問題なく動きます。しかしP4に1、P6に5と範囲を増やすとエラーが出て動きません。どこをなおしたらよろしいでしょうか? Option Explicit Sub 一括() Dim I As Worksheet Dim SheetName As String Dim Prompt As String Dim Col As Integer Dim Cell As Range Dim Row As Long Dim hani As Long For hani = Range("P4").Value To Range("P6").Value Set I = ActiveSheet SheetName = Cells(hani + 4, "K").Value & "(" & Cells(hani + 4, "B") & ")" Prompt = SheetName & "が存在します。" Sheets("基本シート").Copy After:=Sheets("基本シート") On Error GoTo 100 ActiveSheet.Name = SheetName On Error GoTo 0 Range("X3") = I.Cells(hani + 4, "B") Range("E8") = I.Cells(hani + 4, "C") Range("A13") = I.Cells(hani + 4, "D") For Col = 0 To 8 Step 4 Set Cell = I.Cells(hani + 4, "D").Offset(, Col) If Cell > 0 Then Prompt = "該当する日付がありません。" & Cell.Address On Error GoTo 100 Row = WorksheetFunction.Match(Cell, [A:A], 0) On Error GoTo 0 Cells(Row, "E") = I.Cells(hani + 4, "E").Offset(, Col) Cells(Row, "H") = I.Cells(hani + 4, "F").Offset(, Col) If Col < 8 Then Cells(Row, "Y") = I.Cells(hani + 4, "G").Offset(, Col) End If End If Next Col Next hani End 100 If Err <> 1004 Then Error Err End End If MsgBox Prompt, vbCritical Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True Sheets(1).Select End Sub

  • セルが空か0か

    VBでプログラミングをしているのですが、あるセルが空かどうかを調べるために If Cells(0,0)=Empty Then 等という風に書いたらセルA1が0と入力されているときもThen以下が処理されてしまいます、セルA1が0のときと空のときの処理を分けたいのですがどうすればいいか教えてください。

  • ドラッグでセルを選択した後に

    ドラッグでセルを選択した後に、別の場所をドラッグするとその前に選択したセルの色が消えるようにしたいのですがどなたか方法がわかりますでしょうか? 施設予約サイトを作っているのですが、間違えた時間をドラッグしたときに、もう一度別のセルをドラッグすると、予約するための情報は最後にドラッグしたときの情報をとるのですが、UI的にはよくないので直したいと思っているのですが、できません。わあかるかたいたらお願いします。 ドラッグは縦一列のみできるように制限をかけています。 下は、セルをドラッグするところに関係するコードです。まだ必要なコード(仕組みが分かるコード)があるときには補足します。 var startCell = null; //マウスダウンのイベント処理 function mouseDown(table, e){ if (!e) var e = window.event; startCell = e.srcElement? e.srcElement: e.target; if(startCell.tagName != "TD"){ startCell = null; return; } mouseMove(table, e); } //マウスアップのイベント処理 function mouseUp(table, e){ if (!e) var e = window.event; var endCell = e.srcElement?e.srcElement:e.target; if(!(endCell.tagName=="TD" && startCell)) return false; //セルの位置を取得 var from = getCellPos(table, startCell); var to = getCellPos(table, endCell); if(!from || !to) return false; //mouseMoveで選択状態表示の更新をさせないようにする startCell = null; //alert("("+from.col+", "+from.row+") -> ("+to.col+", "+to.row+")"); document.form1.fromcol.value=from.col; document.form1.fromrow.value=from.row; document.form1.tocol.value=to.col; document.form1.torow.value=to.row; } //マウス移動のイベント処理 function mouseMove(table, e){ if (!e) var e = window.event; var endCell = e.srcElement?e.srcElement:e.target; if(!(endCell.tagName=="TD" && startCell)) return false; //セルの位置を取得 var from = getCellPos(table, startCell); var to = getCellPos(table, endCell); if(!from || !to || from.day != to.day) return false; //色を変更 var x, y, cells; for(y=2; y<table.rows.length; y++){ row = table.rows.item(y); for(x=0; x<row.cells.length; x++){ if((from.row-y)*(y-to.row)>=0 && (from.col-x)*(x-to.col)>=0) row.cells.item(x).style.backgroundColor = "#888888";//選択状態の色 //else // row.cells.item(x).style.backgroundColor = "transparent";//未選択状態の色 } } } //tableの中のcellの位置を取得する function getCellPos(table, cell){ var pos = new Object(); if(cell.nodeName == "TD"){ var x, y, cells; for(y=0; y<table.rows.length; y++){ row = table.rows.item(y); for(x=0; x<row.cells.length; x++){ if(row.cells.item(x) == cell){ pos.row = y; pos.col = x; if(2>y || 1>x) pos = null; pos.day = (x+1 - (x+1)%2) / 2; return pos; } } } } return null; } </script>