2011-08-01 20 views
0

私はPerlスクリプトを持っています。その関連ビットは以下に掲載されています。PerlループのExcelスプレッドシートへの出力

# Pull values from cells 
     ROW: 
     for my $row ($row_min + 1 .. $row_max) { 
      my $target_cell = $worksheet->get_cell($row, $target_col); 
      my $response_cell = $worksheet->get_cell($row, $response_col); 

      if (defined $target_cell && defined $response_cell) { 
       my $target = $target_cell->value(); 
       my $response = $response_cell->value(); 

# Determine relatedness 
       my $value  = $lesk->getRelatedness($target, $response); 

# Copy output to new Excel spreadhseet, 'data.xls' 
       my $workbook1 = Spreadsheet::WriteExcel->new('data.xls'); 
       my $worksheet1 = $workbook1->add_worksheet(); 
       $worksheet1->set_column(0, 3, 18); 
       my $row = 0; 

       foreach ($target) { 
       $row++; 
       $worksheet1->write($row, 0, "Target  = $target\n"); 
       $worksheet1->write($row, 1, "Response = $response\n"); 
       $worksheet1->write($row, 2, "Relatedness = $value\n"); 
       } 
      } 
     } 

このスクリプトでは、PerlモジュールParseExcelとWriteExcelを使用しています。入力データのスプレッドシートは、2つの列の下にある単語のリストです.1つは「ターゲット」とラベル付けされ、もう1つは「レスポンス」と表示されます。スクリプトは、各ターゲット単語と各応答の単語を取り、それらの間の関連性の値(つまり、コードの

$lesk->getRelatedness 

セクションがやっているものだが計算されます。これは、指標を計算したWordNet ::類似性と呼ばれるPerlモジュールを呼び出しています単語間の関連性)。

これはすべて正常に動作します。問題は、新しいExcelファイルに出力(類似度の測定値、またはこのスクリプトの$値)を書き込もうとしていることです。コードで何をしても、私に与える唯一の出力は、最後のターゲットとレスポンスワードの間の関連性です。残りのすべてを無視します。

ただし、これはExcelファイルに書き込もうとしている場合にのみ発生します。代わりに 'print'関数を使用すると、コマンドウィンドウにすべての出力が表示されます。私はいつもこれをコピーしてExcelに貼り付けることができますが、これを自動化することができればもっと簡単になります。何が問題なのか?

+1

'foreach($ target)'は役に立たないループです。 '$ target'は単一の変数です。ループは1回だけ実行され、' $ row'は常に1になります(0にリセットされるため)。また、厳密な警告と警告を使用していた場合は、前に定義した '$ row'変数の警告を受けているはずです。 – TLP

+0

私は厳格と警告を使いました。それは私にエラーメッセージを与えませんでした。 foreachループを置き換える方法の提案はありますか? $ targetと$ responseの各値を配列の要素として保存することは可能ですか? – Billy

+0

このコードは、同じスコープ内の2つの場所で 'my $ row'を宣言しているので、エラーが発生します。そうでなければ、何か怪しいです。私が言ったforeachループは、スカラー値が1つの値しか持つことができないので役に立たない。あなたが達成しようとしていることを知らずに、それを修正する方法を言うのは難しいです。しかし、同じ '$ row'に書き込んでいるので、最後に表示された値しか表示されません。 – TLP

答えて

2

毎回$ rowの値を0にリセットします。

+0

私はそれを取り出してスクリプトを再実行しました。同じ結果。 'my $ row = 0'コードでは、行2のみが出力されました。これを取り出したときに、最後のデータの出力が得られましたが、今度は31行目まで下がっています。それはどこにあるべきですか?しかし、残りの行に対してデータが埋められないのはなぜですか? – Billy

+1

Billy、print文を追加して、条件付きif文が利用されているかどうか確認してください。両方の値が定義されていない可能性があるため、印刷されない可能性があります。また、複数のファイルを生成している場合は、forループの最後にworkbook1-> close()を追加することをお勧めします。 – Cooper

+0

ありがとうございます。 「印刷」を使用すると、適切な値がすべて表示されます。 – Billy

2

問題が解決しました。

my $workbook1 = Spreadsheet::WriteExcel->new('data.xls'); 
my $worksheet1 = $workbook1->add_worksheet(); 

行をスクリプトの別の部分に移動するだけでした。彼らは 'for'ステートメントに入っていたので、プログラムはループを通過するたびに 'data.xls'ファイルを上書きし続けました。

+0

私のミスを私に見せてくれたJohn McNamaraに感謝します。 – Billy

関連する問題