2014-07-16 43 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