2

私はこれが初めてで、このタスクを実行する方法の手がかりが必要です。次のサンプル データを含む csv ファイルがあります。

site,type,2009-01-01,2009-01-02,....
X,A,12,10,...
X,B,10,23,...
Y,A,20,33,...
Y,B,3,12,...

and so on....

(指定されたユーザー入力に従って) csv ファイルからデータを読み取り、XY(散布) チャートを作成するための perl スクリプトを作成したいと考えています。日付が 2009-01-01 でタイプ B のグラフを作成したいとします。ユーザーは「2009-01-01 B」のようなものを入力する必要があり、CSV ファイルの値を使用してグラフを作成する必要があります。

誰かが最初にコードを提案してもらえますか?

4

4 に答える 4

6

コードから始めないでください。CPAN から始めます。

CSV散布図

于 2009-08-27T12:26:51.320 に答える
3

さあ、最初にいくつかのコードを見てみましょう。

#!/usr/bin/perl -w
use strict;

use Text::CSV;
use GD;
use Getopt::Long;

もちろん、GDの代わりに、好きなモジュールを使用できます。

于 2009-08-27T13:07:06.760 に答える
2

OK、娯楽目的のみ

#!/usr/bin/perl

use strict;
use warnings;

use DBI;
use List::AllUtils qw( each_array );

my $dbh = DBI->connect("DBI:CSV:f_dir=.", undef, undef, {
        RaiseError => 1, AutoCommit => 1,
    }
);

my $sth = $dbh->prepare(qq{
    SELECT d20090101 FROM test.csv WHERE type = ? and site = ?
});

$sth->execute('B', 'X');
my @x = map { $_->[0] } @{ $sth->fetchall_arrayref };

$sth->execute('B', 'Y');
my @y = map { $_->[0] } @{ $sth->fetchall_arrayref };

my @xy;

my $ea = each_array(@x, @y);
while ( my @vals = $ea->() ) {
    push @xy, \@vals;
}

my @canvas;
push @canvas, [ '|', (' ') x 40 ] for 1 .. 40;
push @canvas, [ '+', ('-') x 40 ];

for my $coord ( @xy ) {
    warn "coords=@$coord\n";
    my ($x, $y) = @$coord;
    $canvas[40 - $y]->[$x + 1] = '*';
}

print join "\n", map { join '', @$_ } @canvas;

軸を追加し、ScatterPlot(本当に残念なモジュール)を一般的に改善することは、読者の練習問題として残されました。

SQLに関しては、私は常にごまかさなければならないことに注意してください。JOIN、、の必要性をなくす@x適切なもの@yをいただければ幸いeach_arrayです。

出力:

|
|
|
| *
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| *
|
|
+ ----------------------------------------
于 2009-08-27T13:21:58.683 に答える