[ruby-list:37652] Re: マッチした部分を配列にしまう方法

From: Sako <sakoh@...2.so-net.ne.jp>
Date: 2003-05-07 07:49:06 UTC
List: ruby-list #37652
酒匂と申します。

多分開発ツールとして 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******" が全部一つながりに(汗))。
>
>要領を得ない聞き方で恐縮ですが、何がしかご示唆いただければ幸いです。
>よろしくおねがいいたします。
>
>ひらの 

-----------------------------------------------------------------------
<Sako Hiroshi>  -- 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.      
-----------------------------------------------------------------------



In This Thread