• ベストアンサー

perlで重複データを集計

aaaaaa,10 bbbbbb,8 cccccc,3 bbbbbb,2 aaaaaa,1 このようなデータをHTMLフォームから取り込み aaaaaa,11 bbbbbb,10 cccccc,3 と、同じデータの合計値を出すシンプルな方法を教えてください。 CSVからの読み込みではなくフォームからのデータになります。

  • CGI
  • 回答数2
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
回答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あたりで出力して、下にフォームを表示するくらいしないと不便だと思いますが、そこは自分でやってみてください。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

私だったら %total みたいなハッシュに ($k,$v) = split(/,/) とかして $total{$k} += $v ; で足していきます。

関連するQ&A

  • エクセルのデータを一部抽出する方法をお教えください

    こんにちは。宜しくお願い致します。 エクセルのA列に以下の番号が入っています。  A  ――――――― 1|AAAAAA-01 2|AAAAAA-02 3|AAAAAA-03 4|BBBBBB-01 5|BBBBBB-02 6|BBBBBB-03 7|CCCCCC-01 8|CCCCCC-02 9|CCCCCC-03 10|・ 11|・ 12|・ 同じ番号にそれぞれ「-01」「-02」「-03」がついてしまっています。 この情報で、「-01」のみの行を抽出したいのですが、難しく考えてしまったせいか、上手く行きません。 エクセルにお詳しい方、方法を教えて下さい。 宜しくお願い致します。

  • エクセル/行選択の仕方を教えてください。

    はじめまして。 エクセルで、3行ごとに選択し、選んだ情報を列に移す作業をしたいのですが 1800行あり手で選択するのが大変です。 行いたい作業は以下の通りです。 A列 AAAAAA BBBBBB CCCCCC AAAAAA BBBBBB CCCCCC AAAAAA BBBBBB CCCCCC AAAAAA ↓ A列 B列 C列 AAAAAA BBBBBB CCCCCC AAAAAA BBBBBB CCCCCC AAAAAA BBBBBB CCCCCC 一行一行選択して列に移すのではなく選択できる方法がありましたら 是非ご教授ください。 よろしくお願いいたします。

  • 文字列の並べ替え

    以下のようなテキストがあります。 AAAAAA BBBBBB CCCCCC DDDDDD CCCCCC BBBBBB BBBBBB DDDDDD AAAAAA これを↓のように横軸で並べ替えたいのです。 AAAAAA BBBBBB CCCCCC BBBBBB CCCCCC DDDDDD AAAAAA BBBBBB DDDDDD 使えるツールとしてはGoogleスプレッドシートです。 なにかいい手順はないでしょうか。

  • Excelで複数行の置き換えを行いたい

    Excelで複数行の置き換えを行いたいと考えています。 例えば、Excelのシートの中身が aaaaaa bbbbbb cccccc bbbbbb aaaaaa bbbbbb であったとします。このとき、 aaaaaa bbbbbb を zzzzzz vvvvvv に置き換えて、 zzzzzz vvvvvv cccccc bbbbbb zzzzzz vvvvvv というようにしたいです。 なにか良い方法はないでしょうか?

  • エクセルでピボットを組むと、集計されたデータの一番上にしかデータが出て

    エクセルでピボットを組むと、集計されたデータの一番上にしかデータが出てこなくなります。 集計した上で、すべての行にデータを入力することはできないのでしょうか。 【現状】 大分類  中分類  小分類 AAAAA  BBBBBB  CCCCCC (空白) (空白) CCCCCC (空白) DDDDDD  EEEEEE (空白) (空白) EEEEEE     ↓↓↓↓ 【理想】 大分類  中分類  小分類 AAAAA  BBBBBB  CCCCCC AAAAA  BBBBBB  CCCCCC AAAAA  DDDDDD  EEEEEE AAAAA  DDDDDD  EEEEEE もしやり方があるのであれば、教えてください。

  • SELECT結果から重複行を除く方法

    下記のようなテーブルから重複なくSELECTしたいと考えています。 temp_table ------------------------ | id | name_1 | name_2 | ------------------------ | 1 | aaaaaa | bbbbbb | | 2 | cccccc | dddddd | | 3 | cccccc | dddddd | | 4 | aaaaaa | bbbbbb | | 5 | cccccc | jjjjjj | ------------------------ SELECT結果が下記の要になるのが理想です。 DISTINCTを利用して SELECT DISTINCT id, name_1 || name_2 AS name FROM temp_tableとしましたがダメでした。 --------------------- | id | name     | --------------------- | 3 | ccccccdddddd | | 4 | aaaaaabbbbbb | | 5 | ccccccjjjjjj | --------------------- よい方法をご存じの方、宜しくお願いします。

  • Accessのクエリとテーブル突合せについて

    いつもお世話になっています。 Access2007で下記のような2つのテーブルをクエリで比較した際、なぜかNULLの部分だけのぞんだ結果にならないという現象があり、理由がわからず困っています。 内容としては、「(1)明細データ」のすべてと、「(2)コード表」をあて、「(3)結果リスト」のような表示でコードを追記するようなものです。 下記の「__」は表記の便せん上分かりやすいようNULLを示しています。 「(1)明細データ」はクエリで2つのテーブルを突き合わせ「区」を付けたしたもので、「(2)コード表」はマスタ用のテーブルとして手作りしています。 「(2)コード表」を手作りする際にはNULLの部分はなにも入れずに空にしています。 (1)明細データ 商品名 区 AAAAAA XX BBBBBB YY BBBBBB YY CCCCCC XX CCCCCC YY CCCCCC __ (2)コード表 商品名 区 変換CD AAAAAA XX 000101 AAAAAA YY 000102 AAAAAA __ 000199 BBBBBB XX 000201 BBBBBB YY 000202 BBBBBB __ 000299 CCCCCC XX 000201 CCCCCC YY 000202 CCCCCC __ 000299 (3)結果リスト 商品名 区 変換コード AAAAAA XX 000101 BBBBBB XX 000201 BBBBBB YY 000202 CCCCCC XX 000301 CCCCCC YY 000302 CCCCCC __ 000399☆ ところが、クエリで実現しようとするとこの「(3)結果リスト」の☆のついている一番最後の結果が CCCCCC __ ______ となってしまい、変換コード部にコードを埋め込むことができません。 こういう現象は初めての為、どのように聞くべきかわからないのですが、もし何かご存知、ないし、ヒントになり得ることを知っておりましたらお教えください。 以上、よろしくお願いいたします。

  • perl シングルコーテーションを含んだ文字編集

    active perl(アクティブパール)で 以下の文字列編集を行いたいのですが、 シングルコーテーションの編集で上手く出来ずに困っています。 どなたか経験豊富な方、良いコーディング方法があれば ご教授下さい。 やりたい事としては、 文字列 aaaaaa bbbbbb cccccc dddddd といった内容を 取り込んで 'aaaaaa','bbbbbb','cccccc','dddddd' といった文字列の出力を行います。 上記の例では文字はddddddまでですが、 場合により bbbbbbまでたったりといった感じで 変換前の文字の行数は可変で、2行でも3行でも4行でも、 各行の文字をシングルコートで囲って、カンマでつなげた文字列を出力します。 上記の仕様内容で、こうすれば出来る! といったサンプルコードを教えていただけると助かります。

  • perlプログラム 外部複数ファイルの読み込み処理について

    perlプログラム 外部複数ファイルの読み込み処理について あるフォルダに T0001_05_01,T0001_05_02,T0001_05_03,…,T0001_05_31 という31個のファイルがあります。 それぞれのファイルは 下記のような 形式で記述されております。 (例 T0001_05_01のファイルの中身) 2010-05-01 00:00:00.000 N00001 AAAAAA 2010-05-01 00:00:00.108 N00018 BBBBBB 2010-05-01 00:00:10.305 N00002 AAAAAA 2010-05-01 01:00:10.966 N00008 CCCCCC … また、別のlist.txtに 下記のようなユニークなリストが入っております。 AAAAAA CCCCCC WWWWWW … このとき、list.txtの値が それぞれT0001_05_XXファイルの何行目に出力されているか 出力するperlプログラムを作成したい。 (出力結果イメージ:1ファイル化) T0001_05_01 1行目 2010-05-01 00:00:00.000 N00001 AAAAAA T0001_05_01 3行目 2010-05-01 00:00:10.305 N00002 AAAAAA … T0001_05_31 10行目 2010-05-31 03:00:00.999 N00400 AAAAAA T0001_05_01 4行目 2010-05-01 00:00:00.000 N00008 CCCCCC … perlプログラム知識がないものなので、このようなファイルの出力の仕方がわかりません。 教えていただけると助かります。

    • ベストアンサー
    • Perl
  • エクセルのオートフィルターにつきまして

    エクセルのことでお聞きしたいことがあります。 下のような、AAAやDDDについての説明がとなりの列に複数行表示されているようなデータを作りました。 AAA aaaaaa     bbbbbb     cccccc DDD dddddd     eeeeee     ffffff そこで、AAAやDDDが書いてある列からAAAだけを選択できるようにして、 AAA aaaaaa     bbbbbb     cccccc のように、AAAの説明のみが表示されるようにしたいのですが、オートフィルターを使ってもうまくいきませんでした。 どなたか、良い方法をご存知でしたら、教えてください。お願い致します。