![](/img/trans.png)
[英]How to Install “simple-spreadsheet” gem in MAC using terminal? (Ruby)
[英]simple-spreadsheet not properly loading an xls file on ruby, but working properly on irb
我目前正在嘗試使用ruby 2.1.1打開並解析此xls文件 。 最簡單的方法是使用簡單電子表格gem,它對於此特定電子表格(以及其他幾個電子表格)似乎無法正常工作:
require 'simple-spreadsheet'
s=SimpleSpreadsheet::Workbook.read('151.xls')
puts s.last_row #prints 5
但是,當我將這個確切的代碼復制並粘貼到irb中時,我得到了正確的答案
2.1.1 :001 > require 'simple-spreadsheet'
=> true
2.1.1 :002 > s=SimpleSpreadsheet::Workbook.read('151.xls')
=> #prints the entire contents of the spreadsheet
2.1.1 :003 > s.last_row
=> 154
使用Roo時,會發生相同的行為(這是意料之中的,因為簡單電子表格使用Roo打開.xls文件):
require 'roo'
s=Roo::Excel.new('151.xls')
puts s.last_row #prints 5, should print 154
在irb上
2.1.1 :001 > require 'simple-spreadsheet'
=> true
2.1.1 :002 > s=Roo::Excel.new('151.xls')
=> #prints the entire contents of the spreadsheet
2.1.1 :003 > s.last_row
=> 154
進一步挖掘,我嘗試使用電子表格,這是Roo的excel.rb文件所必需的:
require 'spreadsheet'
Spreadsheet.open('151.xls') do |book|
rows=0
book.worksheet(0).each do |row|
rows+=1
end
puts rows#prints 5
end
但是,這很奇怪。 當我將最后的代碼復制並粘貼到irb中時,我得到
2.1.1 :001 > require 'spreadsheet'
=> true
2.1.1 :002 > Spreadsheet.open('152.xls') do |book|
2.1.1 :003 > rows=0
2.1.1 :004?> book.worksheet(0).each do |row|
2.1.1 :005 > rows+=1
2.1.1 :006?> end
2.1.1 :007?> puts rows
2.1.1 :008?> end
5
=> nil
我可能還應該補充說,這些寶石不僅印刷了5張,還印有5張。 該行下方的每個單元格返回nil; 他們實際上停止在該特定行之后解析文件。
所以這是我的問題:拳頭,為什么irb的行為不同於紅寶石? 其次,為什么所有這些gem都不加載整個電子表格? 第三,我該如何解決?
謝謝你的幫助
這是我見過的最奇怪的問題之一。 要回答您的問題:
首先,為什么irb的行為不同於紅寶石?
IRB是用ruby編寫的工具,與直接執行ruby不同。 主要區別之一是IRB具有可在啟動時設置的不同選項。 您可以在source中看到不同的標志,並且此頁面對這些標志的含義有一些很好的描述。
您看到的不一致的--noinspect
是--noinspect
選項,運行irb --noinspect
,執行代碼應該給您與運行ruby程序相同的奇怪行為(在此您僅看到5行)。 這是因為irb默認會在執行的每一行上調用inspect,因此,當您調用s=SimpleSpreadsheet::Workbook.read('151.xls')
,實際上就像在ruby程序中調用此代碼一樣:
s = SimpleSpreadsheet::Workbook.read('151.xls')
s.inspect
為什么調用s.inspect
重要? 繼續閱讀...
其次,為什么所有這些gem都不加載整個電子表格?
這是最難回答的問題,我還沒有100%明確指出,但希望90%的解釋足夠好。 簡而言之,您提到的所有寶石都依賴於spreadsheet
寶石。 在此特定設置中,該寶石的古怪/錯誤之一(我認為它的設計目的並非總是這樣),似乎是它依賴於inspect
方法。 如果您在工作表上調用inspect
,則與不調用它相比,它保留的值更多。 這就是說,如果您不調用inspect
只是讀取文件的一部分(或者不知道其中的一部分而忽略其余部分,我不確定),但是如果您調用call inspect
它將完全讀取文件。
第三,我該如何解決?
正如我之前提到的,手動調用inspect
應該讀取整個文件:
s = SimpleSpreadsheet::Workbook.read('151.xls')
s.inspect
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.