人に聞けない痔の悩み、これでスッキリ >>

Perlにお詳しい方お願いします。

以下のような買い物リスト(商品名でソートされています)を

バナナ Aさん
バナナ Bさん
バナナ Cさん
ブドウ Aさん
ブドウ Cさん
リンゴ Aさん
リンゴ Bさん


以下のように横並びにしたいです。

バナナ Aさん・Bさん・Cさん
ブドウ Aさん・Cさん
リンゴ Aさん・Bさん

splitで商品名と依頼主を分けて、商品名が1つ上の列と
同じだったら行の最後に追加をします方法にしたいと
思っていますけれど、現在考えています方法ですと、
(1つ上の列と比較しています為に)2名までしか対応が
出来ませんで、A~Cさんの3名の対応が出来ません。

依頼主何名でもOKという具合でプログラムを作りたい
ですので、お詳しい方よろしくお願いします。

質問者からの補足コメント

  • うれしい

    tatsu99さん、
    ありがとうございます。
    補足書かせていただきます

    1.買い物リスト(商品名でソートされています)は、テキストファイルですか。
    →テキストファイルです。そのファイルをPerl内でOPENしようとしております

    2.商品名と依頼主は半角の空白1個で区切られていますか。
    →現在は商品名と依頼主は『全角スペース1個』で区切られておりますが、
     半角スペースでも大丈夫です。
     ※区切り文字は連続しました複数スペースではありませんで、半角or全角の
      スペース1個です

    3.出力結果も空白1個で区切って、商品名と依頼主(複数の依頼主を全角の「・」で連結したもの)を出力すれば良いのですか。
    →ありがとうございます。そのようにしたいです
     また、申し訳ございません。データはソートの前にuniq処理をかけており
     まして、『バナナ Aさん』は1回しか登場しませんです。

      補足日時:2019/06/28 10:30

A 回答 (3件)

以下のスクリプトを作成してください。

sample.plとします。
perl sample.pl 買い物リストのファイル名
とすると、結果が画面に表示されます。
買い物リストの区切り文字は全角の空白1個を前提に作成しています。必要であれば、splitの箇所を修正して下さい。
--------------------------------------
$fname = $ARGV[0];
open(INF,$fname) or die "open error";
%hash_name = ();
while(<INF>){
chomp $_;
($name,$cust) = split(' ',$_);
if (exists $hash_name{$name}){
$hash_name{$name} = $hash_name{$name} . '・' . $cust;
}else{
$hash_name{$name} = $cust;
}
}
close(INF);
foreach $key (keys %hash_name){
print "$key $hash_name{$key}\n";
}

----------------------------------
以下、実行結果
perl sample.pl goo2.txt
バナナ Aさん・Bさん・Cさん
リンゴ Aさん・Bさん
ブドウ Aさん・Cさん
    • good
    • 0
この回答へのお礼

ありがとうございます。
コマンドラインからではありませんで、Windows上で.plファイルを
ダブルクリックして特定ファイルへ出力します方法へと若干変更を
いたしましたが、スゴイです。出来ました!

お礼日時:2019/06/28 17:56

適切にプログラムが組まれていれば「1つ上の列と比較」すれば「2名までしか対応が出来ません」ということにはならないはずなんだけどなぁ.



まあ困ったらハッシュでなんとかすればいいんだけど.
    • good
    • 0
この回答へのお礼

ありがとうございます。
foreach文の中で
$key_1行上の処理
$key_現在行の処理
その他
$key_1行上 = $key_現在行を代入
というイメージで1行バッファにして使います方法しか分かりませんで
(独学の素人ですので)
ハッシュがチンプンカンプンでして…
勉強不足痛感します…

お礼日時:2019/06/28 17:59

補足要求です。


1.買い物リスト(商品名でソートされています)は、テキストファイルですか。
2.商品名と依頼主は半角の空白1個で区切られていますか。
3.出力結果も空白1個で区切って、商品名と依頼主(複数の依頼主を全角の「・」で連結したもの)を出力すれば良いのですか。
3.データが
バナナ Aさん
バナナ Aさん
のように、同じ商品かつ同じ依頼主のデータが複数そんざいするようなケースは考えなくてよいですか。
複数あると
バナナ Aさん・Aさん
のように出力されます。
    • good
    • 0
この回答へのお礼

ありがとうございます。
No.3のほうにお礼させて戴いております。

お礼日時:2019/06/28 17:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング