No.2ベストアンサー
- 回答日時:
CSVというのはCSVファイルと予想しますが、ファイルからとフォームからでそんなに違わないと思うのですが。
ファイルは簡単に行ごとにわかれた配列として読み込むことができますよね。
フォームからデータを受け取って、行ごとの配列にするのもsplitを使えば簡単でしょう。
そうすると、行ごとの配列を受け取って集計するサブルーチンを作ればどちらにも使えると思いませんか?
あとは#1さんのおっしゃるとおりやると良いでしょう。
連想配列だけでやると整列して出てこないので、ちょっと工夫が必要です。
というわけで、ちょっと書いてみました。
use strict;
sub aggregate {
my $csvp = shift;
my @csv = @$csvp;
my %subtotal;
my @order;
foreach (@csv) {
chomp;
my ($id, $num) = split(/,/);
if (!exists $subtotal{$id}) {
push(@order, $id);
}
$subtotal{$id} += $num;
}
my $ret = "";
foreach my $key (@order) {
my $value = $subtotal{$key};
$ret .= "$key,$value\n";
}
return $ret;
}
use CGI;
my $q = new CGI;
my $csv = $q->param('csv');
if ($csv) {
my @csv_array = split('\n', $csv);
print $q->header('text/plain');
print &aggregate(\@csv_array);
} else {
print $q->header;
print $q->start_html;
print $q->start_form(-action=>$q->url, -method=>'post');
print $q->textarea(-name=>'csv');
print $q->submit;
print $q->end_form;
print $q->end_html;
}
まず、まじめにCSVを解釈するつもりがなかったのでCSVの値には英数字しか来ないと持っています。本気でCSVを解釈するなら、"の取り扱いを真面目にやる必要があるでしょう。あるいは、Text::CSVなどのモジュールを使ったほうが良いかもしれません。
ちなみに、このプログラムでは入力で出てきた順序を保って出力するようにしています。
例えば、
a,1
c,2
b,3
c,3
と入力すると、
a,1
c,5
b,3
と出します。
先に述べたように、aggregateサブルーチンに与えるデータは行ごとに分けて配列に入れたものであれば良いので、ファイルの場合はもっと単純なコードで使うことができます。
open(my $f, "example.csv");
my @c = <$f>;
close($f);
print &aggregate(\@c);
実際に使う場合はtext/plainでの出力ではなくpreあたりで出力して、下にフォームを表示するくらいしないと不便だと思いますが、そこは自分でやってみてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 毎日取得するデータを順番に反映していく方法 6 2023/08/26 16:22
- HTML・CSS HTMLタグのあるCSVファイルを利用する方法 4 2023/03/19 14:41
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- Excel(エクセル) CSVファイルがカンマ区切りにならない。対処法を教えていただきたいです。 仕事でSMS一斉送信ができ 2 2022/07/01 21:24
- Excel(エクセル) VBA エラーの件 4 2022/10/10 19:14
- Excel(エクセル) Excel Powerクエリーの質問、行数指定は可能でしょうか? 2 2022/08/22 12:54
- Visual Basic(VBA) マクロを教えてください。 7 2023/06/01 19:47
- Visual Basic(VBA) 日付を重複させずに数えたい 4 2022/12/04 16:26
- その他(開発・運用・管理) おんどとりWebStorage APIから温度情報を取得し表示したい 2 2023/08/03 09:53
- CAD・DTP JWW-CADでDXF変換後の線が連動して消える 2 2023/01/13 11:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
htmlからパラメータで、cgiに渡...
-
フォントサイズを変えるには?
-
指定のフォルダに指定のファイ...
-
サーバー上のPDFにCGIでパスワ...
-
wordの数式について 定積分を書...
-
ラジオボタンが両方とも選択で...
-
チェックボックスの返す値
-
WEBページを強制的に横画面で見...
-
INPUT TYPE
-
1つのformに2つのsubmitボタン
-
FC2 掲示版のカスタマイズの仕...
-
「value」に2つの値をセットす...
-
<select>タグの幅設定
-
IIS の@INC ERRORについて教えて
-
MSPゴシックで、一番幅を取る文字
-
iPhoneでセレクトボックスが選...
-
プログラミングについての質問...
-
index.html(トップページ)か...
-
電話番号を読み込むプログラム...
-
別formのhidden項目を自form値...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
htmlからパラメータで、cgiに渡...
-
metaタグについて
-
CGI経由でのPDFファイルをダウ...
-
sendmail 送信先を複数設定す...
-
perl/cgi リダイレクトができない
-
iis+cgiでmultipart/form-data...
-
フォントサイズを変えるには?
-
テキストエリアのインプットをP...
-
ホームページビルダーで作ったh...
-
cgi(perl) sendmailの使い方
-
CSVを読み込んでメニューを作成...
-
フォームメール(iモード用)で...
-
POST送信
-
CGIで~秒後にジャンプします。...
-
cgiについて教えて下さい。
-
CGI内でけいたいスマホの振り分け
-
CGIから表生成(1行に数件のデ...
-
ログファイルの編集についてお...
-
CGI
-
Yomi-Search追加機能で・・・
おすすめ情報