2014-05-04 48 views
0

我需要爲解析項目解析gedcom 5.5文件。 我發現的第一個ruby解析器是一個堆棧級別太深的錯誤,所以我試圖找到替代方案。我發起這個項目:https://github.com/jslade/gedcom-rubyruby​​ gedcom解析器EOF異常

有一些樣品,但我也沒有讓他們工作。

這裏是解析器本身:https://github.com/jslade/gedcom-ruby/blob/master/lib/gedcom.rb

如果我試圖像這樣的例子:

ruby ./samples/count.rb ./samples/royal.ged 

我得到以下錯誤:

D:/rails_projects/gedom_test/lib/gedcom.rb:185:in `readchar': end of file reached (EOFError) 

我寫了一個 「變」 中每種方法更好地展示,這是異常情況下的輸出:

Parsing './samples/royal.ged'... 
INIT 
BEFORE 
CHECK_PROC_OR_BLOCK 
BEFORE 
CHECK_PROC_OR_BLOCK 
PARSE 
PARSE_FILE 
PARSE_IO 
DETECT_RS 

引起問題的確切行

while ch = io.readchar 
在detect_rs方法

# valid gedcom may use either of \r or \r\n as the record separator. 
# just in case, also detects simple \n as the separator as well 
# detects the rs for this string by scanning ahead to the first occurence 
# of either \r or \n, and checking the character after it 
def detect_rs io 
puts "DETECT_RS" 
    rs = "\x0d" 
    mark = io.pos 
    begin 
    while ch = io.readchar 
     case ch 
     when 0x0d 
     ch2 = io.readchar 
     if ch2 == 0x0a 
      rs = "\x0d\x0a" 
     end 
     break 
     when 0x0a 
     rs = "\x0a" 
     break 
     end 
    end 
    ensure 
    io.pos = mark 
    end 
    rs 
end 

我希望有人能幫助我與此有關。

回答

1

Ruby的IO類的readchar方法在遇到文件結尾時將引發一個EOFErrorhttp://www.ruby-doc.org/core-2.1.1/IO.html#method-i-readchar

gedcom-ruby寶石多年來一直沒有碰過,但是有一個問題需要花費幾年才能解決這個問題。

基本上它的變化:

while ch = io.readchar 

while !io.eof && ch = io.readchar 

你可以得到寶石這裏的叉:https://github.com/trentlarson/gedcom-ruby

+0

謝謝你,能解決異常問題,但它不」現在也真的有效。 它說該文件不包含任何人,這不可能是正確的: 'samples/royal.ged'中有0個人和0個家庭。 – Mudvayne

+0

對不起,我不知道gedcom文件 - 我只是想讓你通過EOF錯誤。然而我只是想看到,我在答案中從分支下載了gedcom,並且當我運行'ruby samples/count.rb samples/royal.ged'時,它給了我''樣本/ royal.ged中有3010個人和1422個家庭' .'。 –

+1

是啊..我在Windows機器上使用ruby和rails,我在虛擬linux機器上嘗試了相同的確切示例並獲得正確的輸出。 – Mudvayne