【发布时间】:2012-05-15 01:48:18
【问题描述】:
使用 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,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
【问题讨论】:
-
老实说,基于正则表达式的解决方案是您最好的选择。
-
是的。我得到了程序令人毛骨悚然的感觉,并订购了一本书。只是学习编程,我发现正则表达式是场景的一部分......