アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下の家族名簿から代表者だけ抽出するにはどうしたらよいのでしょうか?以下のテキストファイルの場合、1項目の番号が家族番号になります。

member.txt
1,山田太郎
1,山田花子
1,山田凛
2,田中一郎
2,田中桂子
3,佐藤圭太
3,佐藤洋子

抽出結果を、
山田太郎,田中一郎,佐藤圭太としたいのです。

以上、わかる方がいらっしゃればアドバイスお願いします。

A 回答 (2件)

open(FH,"member.txt");・・・(1)


while(<FH>){・・・・・・・・(2)
 if(/^(\d+),/&&$1!=$flg){・・・(3)
  $famly.=(split(/,|\n/))[1].',';・・・(4)
 }
 $flg=$1;・・・(5)
}
close FH;

(1)member.txtファイルを、ファイルハンドル「FH」に結び付けて読み込みモードでオープンする
(2)ファイルハンドル「FH」から1行ずつ読み込む
(3)行頭に数値、続いてコンマがあったら、(条件1)
  数値の部分は()で括ってあるので特殊変数 $1 に代入される
  $1値と、変数$flg値を比較して違っていたら(条件2)
 条件1合致、かつ(&&)条件2合致ならば
(4)変数$famly に、行の文字列をコンマか改行文字で分割した2番目の要素にコンマを付けた文字列を連結する
(5)変数$flg に 特殊変数$1 の値を代入する

(3)(4)は、
 chomp;・・・改行文字を削除
 if(/^(\d+),(.+)/&&$1!=$flg){
  $famly.=$2.',';
 }
としても良さそうですが、これだと、データが文字コードShift_JISで特定の文字を含むときエラーになるから注意!
    • good
    • 0
この回答へのお礼

m(_ _;)mありがとうございます。
検索でいろいろ調べてもスッキリできなかったのですが、これでよく理解できました!

お礼日時:2009/12/02 16:40

open(FH,"member.txt");


while(<FH>){
 if(/^(\d+),/&&$1!=$flg){
  $famly.=(split(/,|\n/))[1].',';
 }
 $flg=$1;
}
close FH;
    • good
    • 0
この回答へのお礼

ありがとうございます。この通りでできました。
ご迷惑でしょうが、解読について分かれば教えていただけないでしょうか?

/^(\d+),/ は、正規表現で先頭の数字がマッチを意味すると思いますが、&&$1!=$flgは理解できません。
どこでどう処理されて、結果"山田太郎,田中一郎,佐藤圭太"が出るのか解説をお願いします。

お礼日時:2009/12/01 13:17

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