Perl GD::Graph 无效数据集:0 at (pie)
Perl GD::Graph Invalid data set: 0 at (pie)
我正在尝试制作一些 PERL 脚本(我是初学者!)
我拿了一个示例代码并根据我的需要对其进行了编辑。
所以任务是从 csv 文件中读取数据,将它们放入 html-table 中,并以饼图形式显示图表。
table已经可以了,只有饼图是我的问题。我已经查看并尝试了代码中图表部分的许多更改,但没有成功。
这是我的代码:
#!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();
如果有人能给我最后需要的提示,那就太好了。
问候
调试时,始终确认您的数据和脚本流程,切勿假设任何事情都是正确的。
尝试
use Data::Dumper; # at the top of your script
[...]
print Dumper(\@diagarray); # just before your $graph->plot call
您可能会注意到您的数据格式与 http://search.cpan.org/~ruz/GDGraph-1.52/Graph.pm#USAGE
上显示的不同
您将 ArrayRef 传递给 ->plot,而示例显示 ArrayRef 的 ArrayRef:
[
['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();
同时检查错误消息中报告的行。您的每个 ->plot 调用都可能是原因。
补充两点:
- No(!) 代码应该在脚本的 use 行中,因为它们是在编译时处理的,而代码 运行s 在 运行 时间。混合不会损害您的脚本,但看起来 my $DBH = DBI->connect('DBI:CSV:'); 在 use 之前会 运行 CGI::Carp.
- 打印HTML 来自脚本的源代码可以用于测试和学习,但不应该在生产环境中完成,因为它会使维护变得更加困难。尝试使用 Template::Toolkit 或其他东西。
将两个数组引用放入@diagarray 与将标量放入其中没有任何不同。
push(@diagarray,\@labels);
push(@diagarray,\@values);
但是您希望它发生在 while 循环之外。在 while 循环内部是填充@labels 和@values 的地方。两个数组的大小必须相同。
此外,您的脚本试图一次性输出 HTML 和饼图,这将无法正常工作,因为您的浏览器会将其全部视为 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\"/>";
}
或者您可以将饼图代码拆分为一个完全独立的脚本,但这会使维护变得不那么容易,因为如果读取数据的代码发生变化,您必须更新两个脚本。
我正在尝试制作一些 PERL 脚本(我是初学者!)
我拿了一个示例代码并根据我的需要对其进行了编辑。
所以任务是从 csv 文件中读取数据,将它们放入 html-table 中,并以饼图形式显示图表。
table已经可以了,只有饼图是我的问题。我已经查看并尝试了代码中图表部分的许多更改,但没有成功。
这是我的代码:
#!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();
如果有人能给我最后需要的提示,那就太好了。 问候
调试时,始终确认您的数据和脚本流程,切勿假设任何事情都是正确的。
尝试
use Data::Dumper; # at the top of your script
[...]
print Dumper(\@diagarray); # just before your $graph->plot call
您可能会注意到您的数据格式与 http://search.cpan.org/~ruz/GDGraph-1.52/Graph.pm#USAGE
上显示的不同您将 ArrayRef 传递给 ->plot,而示例显示 ArrayRef 的 ArrayRef:
[
['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();
同时检查错误消息中报告的行。您的每个 ->plot 调用都可能是原因。
补充两点:
- No(!) 代码应该在脚本的 use 行中,因为它们是在编译时处理的,而代码 运行s 在 运行 时间。混合不会损害您的脚本,但看起来 my $DBH = DBI->connect('DBI:CSV:'); 在 use 之前会 运行 CGI::Carp.
- 打印HTML 来自脚本的源代码可以用于测试和学习,但不应该在生产环境中完成,因为它会使维护变得更加困难。尝试使用 Template::Toolkit 或其他东西。
将两个数组引用放入@diagarray 与将标量放入其中没有任何不同。
push(@diagarray,\@labels);
push(@diagarray,\@values);
但是您希望它发生在 while 循环之外。在 while 循环内部是填充@labels 和@values 的地方。两个数组的大小必须相同。
此外,您的脚本试图一次性输出 HTML 和饼图,这将无法正常工作,因为您的浏览器会将其全部视为 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\"/>";
}
或者您可以将饼图代码拆分为一个完全独立的脚本,但这会使维护变得不那么容易,因为如果读取数据的代码发生变化,您必须更新两个脚本。