2016-04-22 12 views
0

私は少しPERLスクリプトを作成しようとしています(!私は初心者です)PerlのGD ::グラフ無効なデータセット:0(パイ)で

私は例のコードを取って、自分のニーズに合わせてeditet。

したがって、csvファイルからデータを読み込んでhtmlテーブルに配置し、パイを図で表示することです。

テーブルはすでに動作していますが、円グラフだけが私の問題です。私は既に見て、コードの中でダイアグラムの部分で多くの変更を試みましたが、勝つことはできません。誰もが私の最後の必要なヒントを与えることができれば

#!C:\Perl64\bin\perl.exe -w 
### Variablendeklarationen und Moduleinbindungen ### 
use strict; 

use CGI qw(:standard); 
use CGI::Carp qw(fatalsToBrowser); 
use DBI; 
my $DBH = DBI->connect('DBI:CSV:'); 
my $STH; 
use CGI::Carp 'fatalsToBrowser'; 

### Statement-Vorbereitung ### 
$DBH->{'csv_tables'}->{'daten'} = { 'file' => 'daten.csv'} 
    or die "Konnte Datenbank nicht oeffnen:$!"; 
$STH = $DBH->prepare("SELECT * FROM daten") 
    or die "Konnte SQL-Statement nicht ausfuehren:$!"; 

$STH->execute() 
    or die "Ausfuehren der Datenbankabfrage nicht moeglich:$!"; 

print <<HERE_TEXT; 
Content-type:text/html 

<html> 
<head> 
<title>Datenanzeige CSV-File</title> 
</head> 

<body> 
<center> 
<h1>Folgende Umsatzdaten sind ausgelesen worden:</h1> 
<hr> 
<table border> 
<tr> 
    <td width="200"><b>Filiale:</b></td> 
    <td width="100"><b>Leiter:</b></td> 
    <td width="200"><b>Mitarbeiter:</b></td> 
    <td width="100"><b>Umsatz:</b></td> 
</tr> 

HERE_TEXT 

my @data; 
my @diagarray; 

while (@data = $STH->fetchrow_array()) { 
    my $filiale = $data[0]; 
    my $leiter = $data[1]; 
    my $mitarbeiter = $data[2]; 
    my $umsatz = $data[3]; 

push (@diagarray, $umsatz); 
print qq§<tr>\n<td><b>$filiale</b></td>\n<td>$leiter</td>\n<td>$mitarbeiter</td>\n<td>$umsatz</td>\n</tr>\n§; 
} 
print ("<br><br>"); 

use GD::Graph::pie; 
my $graph = GD::Graph::pie->new(300, 300); 

    $graph->set(
    title => 'Umsatzverteilung Filialen', 
    ) or die $graph->error; 

#my @diagram = (\@data,\@diagarray); 

#Debug 
#my $diagram; 
# foreach $diagram(@diagram) 
#  { 
#   print ("$diagram\n"); 
#  } 

my $gd = $graph->plot(\@diagarray) or die $graph->error; 

    my $format = $graph->export_format; 
    print header("image/$format"); 
    binmode STDOUT; 
    print $graph->plot(\@diagarray)->$format(); 

は素晴らしいことだ:

は、ここに私のコードです。 グリーティング

答えて

0

@diagarrayへの2つの配列の参照を取得する方法は、スカラーをどのように押し込むのかとはまったく異なりません。

push(@diagarray,\@labels); 
push(@diagarray,\@values); 

しかし、あなたはwhileループの外側でそれが起こるようにしてください。 whileループの中に@labelsと@valuesを設定する場所があります。どちらの配列も同じサイズでなければなりません。

また、あなたのスクリプトはHTMLとpiechartを一度に出力しようとしていますが、これはあなたのブラウザがすべてHTMLの単なる一塊として扱うため動作しません。あなたのHTMLには別のURLを指す「img」タグが必要です。そのURLは同じスクリプトでも構いませんが、クエリ文字列は異なります。例えば

use CGI 
my $query=new CGI; 
if($query->param("piechart")) { 
    # print out the graph 
} else { 
    print "<img src=\"",$ENV{"SCRIPT_NAME"},"?piechart=1\"/>"; 
} 

または代わりに、あなたは完全に別のスクリプトへの円グラフのコードを分割することができ、それは、データを読み込むためのコードが変わった場合は、2つのスクリプトを更新する必要があるだろうとして、それはあまり簡単に維持することができます。

+0

あなたに感謝します!2つのスクリプトで行い、" MainScript "内のimg-Tagに入れました。いつでも私は$ filialeや$ data [0]を使って作業しました...これはもちろん動作しませんでした。 。 – CHN

+0

$ data [0] [$ count] = $ label; $ data [1] [$ count] = $ value; によって余分な配列の必要性を取り除くことができます。 $ count ++;ループ内の –

1

デバッグするときは、常にデータとスクリプトのフローを確認し、正しいものは絶対使用しないでください。サンプルは配列リファレンスの配列リファレンスを示している>プロット -

あなたのデータ形式は、あなたがに配列リファレンスを渡しているhttp://search.cpan.org/~ruz/GDGraph-1.52/Graph.pm#USAGE

に示されているものと異なっていることに気づくだろうよ

use Data::Dumper; # at the top of your script 
[...] 
print Dumper(\@diagarray); # just before your $graph->plot call 

試してみてください:

[ 
    ['Desc1','Desc2'], 
    [250000, 350000], 
] 

実際の結果が得られるまで、描画部分を抽出して静的データで試すことをお勧めします。その後、たとえば、あなたのデータと静的データをスクリプトに戻ってそれをコピーして置き換えます

#!/usr/bin/perl 
use GD::Graph::pie; 
my $graph = GD::Graph::pie->new(300, 300); 
    $graph->set(
    title => 'Umsatzverteilung Filialen', 
    ) or die $graph->error; 
my @diagarray = (
    ['Title1', 'Title2', ], 
    [ 100, 200 ], 
); 
my $gd = $graph->plot(\@diagarray) or die $graph->error; 
my $format = $graph->export_format; 
print header("image/$format"); 
binmode STDOUT; 
print $graph->plot(\@diagarray)->$format(); 

はまた、エラー・メッセージで報告された行を確認してください。あなたの - >プロットコールのそれぞれが理由かもしれません。

二つの追加発言:(!)のコードが実行時に実行されている間、彼らはコンパイル時に処理しているよう

  1. ないコードは、スクリプトの使用行以内でなければなりません。ミキシングはあなたのスクリプトを害するものではありませんが、my $ DBH = DBI-> connect( 'DBI:CSV:')のように見えます。は、CGI :: Carpを使用してより前に実行されます。
  2. スクリプトからのHTMLソースの印刷は、テストや学習では問題ありませんが、生産性の高い環境では、メンテナンスが難しくなるため、実行しないでください。 Template :: Toolkitなどを使ってみてください。
+1

ご回答いただきありがとうございます。 コードを編集し、次の出力を取得します。 $ VAR1 = ['350000'、 '210000'、 '250000'、 '330000'、 '340000'、 '520000']; ' 私はドキュメントを見れば、配列に問題があるようです彼自身は、しかし、私は本当に彼の問題は何かを理解していない。宣言などの失敗ですか? $ filial変数を追加しようとしましたが、何も動作しないようです... :( CSVをインポートして動作するサンプルを見つけることができず、その円グラフを作成します。 – CHN

+0

私は愚かだと思いますが、 これを "Large"ファイルに追加すると、私はぎこちなくなってしまうという問題があります。 。 可変または静的データを使用するかどうかエラーなしまたは何か コンテンツタイプ:image/gif; charset = ISO-8859-1 GIF89a ,,ÿÿÿÿÿÿÿÿÿÿ!(...) '(短縮コード) – CHN

+0

ヘッダーと本文の間に空白行がありません。 プリントヘッダー(...)を置き換えてください で印刷 "Content-type:image/$ format \ r \ n \ r \ n"; – Sebastian

関連する問題