2017-06-19 80 views
-1

如何逐个处理以File Id开头的行之间的数据。我的下面的代码给出第1节的输出,如果有100 +节由File Id:分隔。阅读文件内容并在Ruby中处理数据

它就像我想拿第一节编排数据然后拿第二节(File ID)等。如果有更好的办法,我一定会听。谢谢。

输入文件(input.txt

File Id: C:/my_files/00_Roll_Tom-values.txt 

#RakeBoss-Random as on 12/19/2016 
[groups] 
met = chk\rel_io_chk, chk\dev_op_io, 
div = chk\kzhr2x, chk\zz52t0, chk\czzjrt 
rakeonly = chk\rzgnsd, chk\cztw5h 

[/] 
@met = rw 
@div = rw 
@rakeonly = r 

File Id: C:/my_files/Rander-values.txt 

#RakeBoss-Jan 21st QA 
[groups] 
met = chk\rel_io_chk, chk\dev_op_io 
div = chk\541kmj, chk\zz52t0 
app_only = chk\zz9ycd 
check_io = chk\wder4, chk\zz9ycd 
div_write = chk\lo98j3 
year_on = chk\3w345f 
[/] 
@met = rw 
@div = rw 
@app_only= r 
@check_io = r 
@div_write = rw 
@year_on = r 

[/wedmin] 
@check_io = rw 
div_write= rw 

[/doc/prod] 
@div = rw 
@app_only = r 
year_on = rw 

File Id: C:/my_files/456_Milo_123-values.txt 

#RakeBoss-Jan 21st Prod 
[groups] 
met = chk\rel_io_chk, chk\dev_op_io 
div = chk\kzhr2x, chk\zz52t0, chk\czzjrt, chk\pzjwr3 
jee_only = chk\zz9ycd, chk\hz659l, chk\zzktgj, 
check_io = chk\8u7y01, chk\zz9ycd 
unique_key = chk\zz9ycd 
year_on = chk\dytg6 
[/] 
@met = rw 
@div = rw 
@rakeonly = r 

[/Release] 
@check_io = rw 
@unique_key = rw 

[/Redmine/Treehub] 
@div = r 
@jee_only = rw 

............. 
................... 
............. so on separated by File Id: 

代码

File.open("input.txt", "r") do |f| 
    fight_info = f.read 
    m = fight_info.match(/File\sId(.+?)File\sId/m) 
    puts m 
end 
+0

输入文件有多大?如果确保它始终适合内存,则可以使用'read'来“啜食”它,但通常不应该以这种方式处理生产系统中的文件。 –

回答

1

你可以做的方法对文件和分裂它的抽象的阅读分为几个部分:

def split_by_file_id(file) 
    lines = [] 
    id = nil 
    File.foreach(file).with_index do |line, line_num| 
    if line =~ /^File Id: (.*)/m 
     yield id, lines if id 
     lines = [] 
     id = $1 
    else 
     lines << line if id 
    end  
    end 
    yield id, lines if id 
end 

# Code to process each section... 
split_by_file_id("input.txt") do |id, lines| 
    lines.each do |line| 
    # do something... 
    end 
end 
+0

非常感谢,如何在[组]和[/]中组织数据 例如,从第1节开始,应该将scm,dev,readonly分配给名为id的数组,并将其相应值逐个分配 – dev

0
file = File.open("input.txt", "rb") 
contents = file.read.split("File Id:") 
contents.shift 

现在,您可以使用contents.each来遍历它。

+0

Be _very_小心这样做。使用'read'会将整个文件拖入内存中,这会破坏性能。请参阅https://stackoverflow.com/q/25189262/128421 –