2011-05-07 72 views
0

我想寫一個CSV「修復程序」。 不幸的是,似乎csv.foreach指令沒有調用我創建的lambda。 CPU使用率爲100%。只是想知道紅寶石在做什麼...csv.foreach卡住了,沒有調用塊

任何想法,爲什麼我的代碼是錯誤的?

1 require "csv" 
    2 
    3 ARGV.empty? do 
    4  print "usage: fixcsv.rb <filename>" 
    5  exit 
    6 end 
    7 
    8 filename_orig = Dir.pwd + "/" + ARGV[0] 
    9 filename_dest = filename_orig.sub(/csv$/,"tmp.csv") 
10 topic = filename_orig.sub(/_entries.csv$/,"").sub(/.*\//,"") 
11 
12 puts "topic:" + topic 
13 
14 writer = CSV.open(filename_dest,"w",:col_sep=>";") 
15 #i=0 
16 cycler = lambda do |row| 
17  #i = i + 1 
18  #puts "row number:" + i.to_str 
19  #row[17] = topic 
20  puts "foo" 
21  writer << row 
22 end 
23 
24 begin 
25  CSV.foreach(filename_orig,:col_sep=>",",&cycler) 
26 rescue 
27  puts "exception:" + $!.message 
28  exit 
29 else 
30  writer.close 
31 end 

這裏是產生的堆棧跟蹤,當我按Ctrl-C它:

刺@ Ubuntu的:〜/炒鍋$紅寶石addtopic.rb civilpoliticalrights_entries.csv

topic:civilpoliticalrights 
^C/usr/lib/ruby/1.8/csv.rb:914:in `buf_size': Interrupt 
    from /usr/lib/ruby/1.8/csv.rb:825:in `[]' 
    from /usr/lib/ruby/1.8/csv.rb:354:in `parse_body' 
    from /usr/lib/ruby/1.8/csv.rb:227:in `parse_row' 
    from /usr/lib/ruby/1.8/csv.rb:637:in `get_row' 
    from /usr/lib/ruby/1.8/csv.rb:556:in `each' 
    from /usr/lib/ruby/1.8/csv.rb:531:in `parse' 
    from /usr/lib/ruby/1.8/csv.rb:311:in `open_reader' 
    from /usr/lib/ruby/1.8/csv.rb:94:in `foreach' 
    from addtopic.rb:25 

編輯:紅寶石版是:

$ ruby --version 
ruby 1.8.7 (2010-01-10 patchlevel 249) [i486-linux] 
+0

爲了給出一個好的答案,我們將需要知道您使用的是哪個版本的Ruby,因爲您使用的API元素在1.8.7中的csv和1.9.x中的csv之間截然不同。這是一個不幸的情況。 (我認爲1.9可能會採用舊API,但如果您使用的是1.8.7,我寧願只專注於此。) – DigitalRoss 2011-05-07 16:00:23

回答

2

你的程序在Ruby 1.9中對我很好。

我有幾點看法:

  • 如果輸入路徑不csv結束,則輸入和輸出文件名是相同的。這很容易產生無限循環。

  • 你絕對使用csv的1.9味道。如果該程序需要在1.8.7運行它需要有從下面的代碼片段補丁...

MODS的爲1.8.7:

writer = CSV.open(filename_dest, "w", ?;) 
#i=0 
cycler = lambda do |row| 
    #i = i + 1 
    #puts "row number:" + i.to_str 
    #row[17] = topic 
    writer << row 
end 

begin 
    CSV.open filename_orig, 'r', ?,, &cycler 

的主要問題1.8.7 csv是CSV.openCSV.foreach的接口不帶哈希選項。更糟糕的是,他們期望的是數字代碼點,這是Ruby的一個特性,顯然沒有成功,並在1.9版中被撤銷。