2010-07-11 32 views
1

我試圖通過文件讀取,找到某個模式,然後在包含該模式的行之後抓取一組文本行。不太確定如何解決這個問題。解析特定行數

+0

聽起來像功課。你到目前爲止有多遠?從一些僞代碼開始(將其添加到您的問題中),然後對其進行優化。當你有更具體的問題時,我們在這裏提供幫助。 – 2010-07-11 04:33:10

+0

如果是作業,它應該被標記爲家庭作業。 – kiamlaluno 2010-07-11 04:39:45

+0

這其實根本不是家庭作業,因爲我根本不是CS的學生,哈哈。我試圖解析日誌到我玩的遊戲。 – Randuin 2010-07-11 04:45:50

回答

1

的工作,如果你想要的文件filename匹配pattern行後n行數:

lines = File.open(filename) do |file| 
    line = file.readline until line =~ /pattern/ || file.eof; 
    file.eof ? nil : (1..n).map { file.eof ? nil : file.readline }.compact 
end 

這應該處理所有情況下,如該模式不存在在文件(返回nil)或存在是所述匹配線後小於n線(包含文件的最後幾行所得陣列。)

+0

+1 - 很好地完成 – 2010-07-11 20:13:08

1

首先將文件解析爲行。打開,讀取就行了分裂打破

lines = File.open(file_name).read.split("\n") 

然後得到指數

index = line.index{|x| x.match(/regex_pattern/)} 

哪裏regex_pattern是你正在尋找的模式。使用指數作爲起點,然後第二個參數是行數(在這種情況下5)

lines[index, 5] 

它將返回數組「行」

你可以結合多一點減少行數。但我試圖保持它的可讀性。

+0

既然這樣打開了整個文件,那麼對於更大的文檔,它會有內存問題嗎? (最多5MB左右) – Randuin 2010-07-11 08:05:39

+0

沒有那麼多,我用類似的方法解析500MB的日誌文件。 – 2010-07-11 11:30:42

+0

即使VM啓用它,將整個文件吸收到內存中的風格也很差。 – 2010-07-11 17:47:14

0
matched = false; 
num = 0; 
res = ""; 

new File(filename).each_line { |line| 
    if (matched) { 
     res += line+"\n"; 
     num++; 
     if (num == num_lines_desired) { 
      break; 
     } 
    } elsif (line.match(/regex/)) { 
     matched = true; 
    } 

} 

這樣做的好處是無需在匹配的情況下讀取整個文件。

完成後,res將保留所需的行。

+0

神聖莫里。這必須是我見過的最醜陋的Ruby代碼。其實,考慮到語法錯誤的數量,我幾乎不會稱之爲Ruby代碼。 – 2010-07-11 08:35:20

+0

這是CRuby!嘿,Ruby支持塊語法。你不*有*使用「開始」和「結束」:-P – Borealid 2010-07-11 08:59:56

1

如果你沒有綁定到Ruby,grep -A 12 trivet將顯示任何帶trivet的行之後的12行。任何正則表達式將在地方「三腳架」

+0

嗯,我實際上仍然需要解析以下任何行。並從中提取信息。所以grep並不適合。 – Randuin 2010-07-11 05:36:18

0
在導軌(唯一的區別是怎麼產生的文件對象)
file = File.open(File.join(Rails.root, 'lib', 'file.json')) 

#convert file into an array of strings, with \n as the separator 

line_ary = file.readlines 
line_count = line_ary.count 

i = 0 
    #or however far up the document you want to be...you can get very fancy with this or just do it manually 

hsh = {} 
line_count.times do |l| 
    child_id = JSON.parse(line_ary[i]) 
    i += 1 
    parent_ary = JSON.parse(line_ary[i]) 
    i += 1 
    hsh[child_id] = parent_ary 
    end 

哈哈我說得太多那肯定應該讓你開始