例えば
@raiten=(
1,12/1,山田花子,200,
2,12/3,日本タロウ,300,
3,12/4,山田花子,50,
4,12/6,日本タロウ,100,
5,12/7,鈴木一郎,60,
6,12/10,山田花子,200,
)
のような配列があったとします。ちなみに上の配列は(順番,日付,名前,購入金額,)の並びです。
これをもとに名前でSQLでいうグループ化をしたいのです。
最終的には下のように出力したいのです。
山田花子の購入金額は合計で450円
日本タロウの購入金額は合計で400円
鈴木一郎の購入金額は合計で200円
いい方法がみつかりません。どなたかご教授いただけますでしょうか?
No.4
- 回答日時:
#回答がすでにでているので止めようかと思ったんですが、
#やってることは、#3の方とほとんど同じですが
#購入品の履歴でなく種類にしてみました。
@raiten=(
'1,12/1,山田花子,200,りんご',
'2,12/3,日本タロウ,300,バナナ',
'3,12/4,山田花子,50,みかん',
'4,12/6,日本タロウ,100,パイン',
'5,12/7,鈴木一郎,60,メロン',
'6,12/10,山田花子,200,すいか',
'7,12/11,山田花子,50,みかん',
);
my %kyaku;
foreach (@raiten){
my ($no, $date, $name, $money, $kind) = split /,/;
unless($kyaku{$name}){ $kyaku{$name} =[0, {}]; }
$kyaku{$name}[0] += $money;
$kyaku{$name}[1]{$kind}++;
}
# 集計結果を出力する。
foreach my $name (keys %kyaku){
print "$nameの購入した金額は合計で$kyaku{$name}[0]で",
join( ',', keys %{$kyaku{$name}[1]}),"を購入しています。<br>\n";
}
重ね重ねありがとうございます。
そのままつかってみてうまくうごいているので感動しています。
でもいったいどうなっているのか構造が複雑ですね・・・
簡単なハッシュならわかるのですが、ここまでくるとなかなか難しいです。
ハッシュをつかってのいろいろなテクニックを書いてあるサイトか書籍はないですか?
BLUEPIXYさんはどこで勉強を??
No.3
- 回答日時:
# > ではたとえば、
# でわ、以下でどうでしょう。
# ・・次はどの商品が一番売れているか?の集計も必要だったりして・・
# ・・なんだか宿題を代行しているような・・
# 配列(裸の文字列)はエラーとなるので、
# 商品名までクオートで囲まれているとして、
use strict;
my @raiten = (
'1,12/1,山田花子,200,りんご',
'2,12/3,日本タロウ,300,バナナ',
'3,12/4,山田花子,50,みかん',
'4,12/6,日本タロウ,100,パイン',
'5,12/7,鈴木一郎,60,メロン',
'6,12/10,山田花子,200,すいか',
);
# 氏名をキーとしてハッシュの構造体に集計する。
my %kyaku;
for( @raiten ){
my @dat = split /,/;
$kyaku{$dat[2]}{'金額'} += $dat[3];
push @{$kyaku{$dat[2]}{'商品'}}, $dat[4];
}
# 集計結果を出力する。
for( sort keys %kyaku ){
my $syohin = join ',', @{$kyaku{$_}{'商品'}};
print "$_の購入した金額は合計で$kyaku{$_}{'金額'}で",
"${syohin}を購入しています。<br>\n";
}
すばらいい。感動しました。
いやーー勉強させていただきました。
本当にありがとうございます。
いままでほとんどハッシュを使わず強引に配列でやってたのがばかばかしいです。
ハッシュをもっと深くまで勉強します。
重ね重ねありがとうございました。
No.2
- 回答日時:
#やってることは、#1の方と同じですが、
#データがまとまりになってない場合
@raiten=(
1,'12/1','山田花子',200,
2,'12/3','日本タロウ',300,
3,'12/4','山田花子',50,
4,'12/6','日本タロウ',100,
5,'12/7','鈴木一郎',60,
6,'12/10','山田花子',200,
);
@datas = @raiten; #コピーで作業する
%sum=undef;
while(@datas){
($no,$date,$name,$money)=splice(@datas, 0, 4);
$sum{$name}+=$money;
}
while(($name, $value)=each(%sum)){
print "$nameの購入金額は合計で$value円\n";
}
さらにわかりやすい解説感謝します。
1の方にも書きましたが、以下のような方法はありますか?
@raiten = (
'1,12/1,山田花子,200',りんご,
'2,12/3,日本タロウ,300',バナナ,
'3,12/4,山田花子,50',みかん,
'4,12/6,日本タロウ,100',パイン,
'5,12/7,鈴木一郎,60',メロン,
'6,12/10,山田花子,200',すいか,
);
のように購入したものを配列に追加して
print "○○の購入した金額は合計でxx円でりんご,みかん,すいかを購入しています。<br>\n";
のように文字と数値の合計を同時に集計した結果を出力は可能でしょうか?
No.1
- 回答日時:
# > のような配列があったとします。
# という配列(裸の文字列)はエラーとなるので、
# 以下のようにクオートで囲まれている場合と同様なデータとして、
my @raiten = (
'1,12/1,山田花子,200',
'2,12/3,日本タロウ,300',
'3,12/4,山田花子,50',
'4,12/6,日本タロウ,100',
'5,12/7,鈴木一郎,60',
'6,12/10,山田花子,200',
);
# 氏名をキーとしてハッシュに集計する
my %kyaku;
for( @raiten ){
my @dat = split /,/;
$kyaku{$dat[2]} += $dat[3];
}
# 集計結果を出力
print "$_の購入金額は合計で$kyaku{$_}円\n" for( sort keys %kyaku );
わかりやすい解説ありがとうございます。
合計をだしたいならハッシュをつかうんですね。
ではたとえば、
@raiten = (
'1,12/1,山田花子,200',りんご,
'2,12/3,日本タロウ,300',バナナ,
'3,12/4,山田花子,50',みかん,
'4,12/6,日本タロウ,100',パイン,
'5,12/7,鈴木一郎,60',メロン,
'6,12/10,山田花子,200',すいか,
);
のように購入したものを配列に追加して
print "○○の購入した金額は合計でxx円でりんご,みかん,すいかを購入しています。<br>\n";
のように文字と数値の合計を同時に集計した結果を出力は可能でしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルの条件付き書式 個人シートを参照して集計シートに色付けしたい 1 2023/06/22 00:39
- タレント・お笑い芸人 種なし 2 2022/06/22 00:30
- Excel(エクセル) アウトラインの小計のやり方 1 2023/03/20 11:51
- Excel(エクセル) 10円の誤差が分からない 11 2022/11/13 07:25
- Excel(エクセル) (教えて下さい)ExcelのSUMIF又はSUMIFSを使って合計値の算出 4 2023/07/24 11:23
- バラエティ・お笑い カラオケバトルの次の出演者の中で歌唱力も魂のこもりようも表現力も抜群と思う人を上位から 1 2022/05/04 14:04
- Excel(エクセル) Excelマクロの差分抽出のコードを教えていただきたいです。 2 2023/03/14 11:40
- Excel(エクセル) エクセル 関数 指定の繰り返しの回数 以降(以前)を削除するには、 2 2022/04/24 10:29
- Excel(エクセル) Excelの1つのセルにそれぞれ文字+数字が入力されていて、 数字のみ抽出して合計したいです。(合計 4 2023/03/16 23:44
- その他(ネットショッピング・通販・ECサイト) Utme!について質問です。Tシャツを購入したく、後払い選択をしたのですが何度やってもエラーが出てし 1 2022/09/04 12:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
tracert ができない原因
-
CGI(Perl)内での必須項目チェ...
-
wordの数式について 定積分を書...
-
ラジオボタンが両方とも選択で...
-
select値をhiddenのvalueに渡し...
-
ディレクトリのファイル数取得
-
フリーズする原因
-
WEBページを強制的に横画面で見...
-
ラジオボタンを選択済みにする...
-
フォントサイズを変えるには?
-
MSPゴシックで、一番幅を取る文字
-
ブックマークからのアクセスを...
-
selectboxの画面遷移で、postデ...
-
CGI経由でのPDFファイルをダウ...
-
Yomi-Searchのカテゴリを縦並び...
-
チェックボックスの返す値
-
コンボ1の内容に応じてコンボ...
-
さくらインターネットのCGI...
-
「value」に2つの値をセットす...
-
CGI実行できない。ソースが表示...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SUN BBSの改造方法
-
CGIメールフォームの件名について
-
perlで書いたcgiでsqliteの使い...
-
CGI(Perl)内での必須項目チェ...
-
チェックボックスでのor検索
-
入力フォームに全角・半角スペ...
-
Windows7でVBScriptによるネッ...
-
tracert ができない原因
-
配列をグループ化して出力したい。
-
電話番号を読み込むプログラム...
-
JNAVIから提供されたメー...
-
日本語文字化け(GETメソッド?)
-
文字って数字で表現・・・
-
sendmail -fオプションの指定は...
-
【ASP.NET MVC】フォームヘルパ...
-
sendmailのメール送信ができま...
-
【CGI】画像の表示の仕方【Mini...
-
添付つきメールフォーム:「an ...
-
同じname属性の結果を1行にまと...
-
太郎を太と郎に分ける方法。
おすすめ情報