- ベストアンサー
条件抽出の方法について教えてください。
以下の家族名簿から代表者だけ抽出するにはどうしたらよいのでしょうか?以下のテキストファイルの場合、1項目の番号が家族番号になります。 member.txt 1,山田太郎 1,山田花子 1,山田凛 2,田中一郎 2,田中桂子 3,佐藤圭太 3,佐藤洋子 抽出結果を、 山田太郎,田中一郎,佐藤圭太としたいのです。 以上、わかる方がいらっしゃればアドバイスお願いします。
- みんなの回答 (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で特定の文字を含むときエラーになるから注意!
その他の回答 (1)
- okmotokun
- ベストアンサー率59% (92/155)
open(FH,"member.txt"); while(<FH>){ if(/^(\d+),/&&$1!=$flg){ $famly.=(split(/,|\n/))[1].','; } $flg=$1; } close FH;
お礼
ありがとうございます。この通りでできました。 ご迷惑でしょうが、解読について分かれば教えていただけないでしょうか? /^(\d+),/ は、正規表現で先頭の数字がマッチを意味すると思いますが、&&$1!=$flgは理解できません。 どこでどう処理されて、結果"山田太郎,田中一郎,佐藤圭太"が出るのか解説をお願いします。
お礼
m(_ _;)mありがとうございます。 検索でいろいろ調べてもスッキリできなかったのですが、これでよく理解できました!