2014-07-16 40 views
-1

我必须从文件中获取特定数据。我需要考虑的是包含特定字符串(“ - 测试”)仅线,并采取了剩余的字符分割线与红宝石中的特定字符串

我的文件中包含类似的几行:

# = = = = = 
# SETTING 
# = = = = = 
# install - ports 
--TEST:ports_1    80 
--TEST:ports_2    1024 
INCLUDE: gvars/controller.cfg # temporary 

我需要解析与“线 - -TEST:”走其余的字符,如‘ports_1’ 我正在使用的代码读取文件:

File.readlines(FILE_NAME).each do |line| 
    ..... 
end 

然后我试图通过串到每行分裂‘ - 测试’和空间“\ s”,但我认为这不是最好的和正确的方式

line.split(--TEST:"\s/).each do |line_parsed| 

回答

1

你可以试试这个:

f = File.read(FILE_NAME) 
f.scan(/^--TEST:(.*)$/) do |l| 
    puts l 
end 

希望它能帮助。

+0

这工作得很好!通过此代码,只有包含字符串“--TEST”的行才会考虑在内。但是,如果我使用l [0],我将获得所有的行并且l [1] NIL。例如,如何访问字符串“port_1”? – user3472065

+0

'/^- TEST:(。*)$ /'→'/^- TEST:(\ S +)\ s +(。*)$ /' – mudasobwa

+0

请注意,'read'与op'readlines'的不同之处在于整个文件将陷入内存,这可能对较大的文件不利。 – Matt

0

如果字段始终格式化取样类似的尝试正则表达式:

re_test_string =/
^      # start of line 
    --TEST:     # string 
    (?<setting>[[:word:]]+) # any word chars, setting 
    [[:space:]]+    # any spaces 
    (?<value>[[:word:]]+) # any word chars, value 
    $      # end of line 
/x 

你可以增加/减少具体谈谈不同character classes

settingvalue区,然后你可以做一些事情比如将所有匹配的字段直接拖入数组中。

settings = File.readlines(FILE_NAME).map do |line| 
    m = line.match(re_test_string) 
    [ m[:setting], m[:value] ] if m 
end.compact 

或直接到哈希Ruby的2.1

settings.to_h