From: Sako Date: 2003-05-07T16:49:06+09:00 Subject: [ruby-list:37652] Re: マッチした部分を配列にしまう方法 酒匂と申します。 多分開発ツールとして ruby を活用なさろうと しているのですよね。機械的な作業は、文字通り 機械に任せて人間はラクをすべきですね。 さて直接のお答えではないのですが、 ファイルの中からあるパターンにマッチする部分を 集めて配列として得る という問題に注目すれば def items (file_name, regexp) r = [] File.open(file_name) { |f| f.each { |line| if match_data = regexp.match(line) then r << match_data[1] end } } r end といった手続きを定義しておけば、 先々使いまわしがきいて便利でしょう。 r = items(ARGV[0], /(efct\w+)/) p r といった感じで使えます。 お尋ねのメールに当てはめれば file_line_shaped = items(3の文書ファイル名, /(efct\w+)/) として file_line_shaped を得ることができます。 もちろん、これが最善というわけではありません。 OOらしくクラス化したり、ファイル処理の部分は やはり分離したり、といろいろ工夫の余地があります。 それでも、こうした部品を少しずつ書き溜めて おくと段々便利になって行きますよ。 では。 At 15:34 03/05/07 +0900, Hirano Satoshi wrote: >こんにちは。 >Rubyを使い始めて日の浅いひらのです。 > >現在、以下のような問題に突き当たっております。 > >0: >あるディレクトリに、"efct******(*は英数字)"という法則性を持ったファイルが収 まっています。 > >1: >ls のリダイレクトで、上記ファイルのリストテキストファイルを作成します。 > ><リストの中身例> >efct000000 >efct000001 >efct000002 >efct000003 >... > >2: >作成したリストを、各行を要素として配列に読み込みます。 > >3: >とある文書ファイルがあり、その文書のテキスト中に1でリストアップしたのと同じ ファイル名が記述されています。 > ><ファイルの中身例> >/* < efct000000 > */ >exec { > ...... >} >/* < efct000003 > */ >exec { >..... > >4: >3のファイルの各行を要素として配列に読み込み、efct****** の部分だけを抜き出し て配列にしまい、かつ2で作成した配列との集合の差を取り出したいと思っていま す。その時、 > >done_efct_lines = 2で作成したファイル.readlines >file_lines = 3の文書ファイル.readlines >file_lines_shaped = [] >diff_lines = [] > ># その1 >file_lines.each { |line| > if /efct\w\w\w\w\w\w/i =~ line > line.gsub! (/ /,"") > line.gsub! (/ line.gsub! (/>/,"") > line.gsub! (/\//,"") > line.gsub! (/\*/,"") > file_lines_shaped << line > end >} > ># その2 >file_lines.each { |line| > if /vc\w\w\w\w\w\w/i =~ line > tmp = $& + "\n" > file_lines_shaped << tmp > end >} > ># その3 >file_lines.each { |line| > line.scan(/vc\w\w\w\w\w\w/i) { |matched| > matched << "\n" > file_lines_shaped << matched > } >} > >diff_lines = file_lines_shaped - done_efct_lines > >としてやると、その2とその3ではdiff_linesの中にまんま、file_lines_shapedが収 まってしまうようなのです。 >その1の時だけ、ちゃんとfile_lines_shaped中の要素からdone_efct_linesの要素が 差し引かれたものだけ収まるのですが、その2その3ではどういった部分がまずいも のなのでしょうか…。 >なお、その2その3で改行コードを追加しないやり方もやってみましたが、やはりダ メでした(改行コードを入れないと、そのファイルを開いた時抽出した"efct******" が全部一つながりに(汗))。 > >要領を得ない聞き方で恐縮ですが、何がしかご示唆いただければ幸いです。 >よろしくおねがいいたします。 > >ひらの ----------------------------------------------------------------------- -- to design is human, design is our business http://www02.so-net.ne.jp/~sakoh/ mailto:sakoh@ba2.so-net.ne.jp Designers' Den Corporation : and for now, No Peace, No Future. -----------------------------------------------------------------------