2

ruby を使用してテキスト ファイル内の単語または語句を検索する 単語をキャプチャして行をスキップし、空白になるまで行を読み取る (繰り返し)

これは、以前の投稿のバリエーションであり、正規表現で回答されました。正規表現なしで実行できるかどうかを確認したいと思います。テキストの例を次に示します。

  MATCH ME 1234

3940393  $100.00   FORTY THOUSAND THIEVES
3455     $ 00.10   ONLY 1% OF THE THIEVES

GOBBLEY GOOK: 344959904       3948820   333333333

MATCH ME

3940321  $110.00   FORTY THOUSAND RICHER PEOPLE
3        $ 00.11   ONLY 1% OF THE RICHER PEOPLE

私がしたい出力はこれです:

MATCH ME,1234,3940393,$100.00,FORTY THOUSAND THIEVES
MATCH ME,1234,3455,$00.10,ONLY 1% OF THE THIEVES
MATCH ME,,3940393,$110.00,FOURTY THOUSAND RICHER PEOPLE
MATCH ME,,3,$00.11,ONLY 1% OF THE RICHER PEOPLE

私が以下に持っているコードは、そこへの道の一部しか得られません。Match me が見つかりますが、返されるのは次のとおりです。

MATCH ME,1234,3940393 ,$100.00,FORTY THOUSAND THIEVES
MATCH ME,1234,3940393 ,$100.00,FORTY THOUSAND THIEVES
MATCH ME,not here,3940321 ,$110.00,FORTY THOUSAND RICHER PEOPLE

入れ子になった if に対する私のアプローチは間違っていると確信していますが、代替案について助けが必要です。

def is_numeric?(object)
  true if Float(object) rescue false
end


def is_match_me_line?(object)
true if object == "MATCH ME" rescue false
end

 def load_file
 raw_records = []
infile = File.open("match_me.txt", "r") 
while line = infile.gets

 possible_match_me = line[0,18]
  match_me_words = line[4,8]


 if is_match_me_line?(match_me_words)

 possible_match_me_number_present = possible_match_me[13,4]   
  if is_numeric?(possible_match_me_number_present)  
   fis_match_me_number = possible_match_me_number_present
   else fis_match_me_number = "not here"  
 end          

line=infile.gets  
line=infile.gets

account = line[0,8] 
amount =  line[9,7] 
description = line[19,40]
record = [match_me_words, fis_match_me_number, account, amount,description]  
raw_records << record
puts raw_records.map {|record| record*','} 

end    
end


end
load_file

提案されているように、正規表現ソリューションを試していますが、このコードから必要な応答が得られません:

File.open("text_2.txt", "r").each_line do |data|

data.scan(/(MATCH ME)(.*?)\n\n((?:(?!\n\n).)*)/m).each do |m, n, lines|
lines.each_line do |line|
puts [m, n, *line.unpack('A9A10A*')].map(&:strip).join(',')
end  
end
end
4

1 に答える 1

2

これが私のものです:

data.scan(/(MATCH ME)(.*?)\n\n((?:(?!\n\n).)*)/m).each do |m, n, lines|
  lines.each_line do |line|
    puts [m, n, *line.unpack('A9A10A*')].map(&:strip).join(',')
  end  
end

この正規表現は醜いですが、それでも 30 行を見るよりはましです。(?:(?!\n\n).)* は、2 つの改行が続いていない任意の文字に一致することを意味します。(?:) であるため、「.」もキャプチャされません。

于 2012-05-15T03:22:27.017 に答える