2014-12-07 38 views
0

我對Ruby很新,我想如果陳述是直觀的,但顯然我錯過了一些東西。Ruby電子表格寶石如果語句工作不正常?

我有一個.xls文件,我正在閱讀電子表格中的寶石。 該文件是這樣的:

開始第2行(三列)(第1行有頭 - 用戶名,ID,計數):

bob   abc 1 
bob   abc 2 
bob   abc 3 
bob   abc 4 
kevin  abc 5 
kevin  abc 6 
kevin  abc 7 
ciara  abc 8 
ciara  abc 9 
ciara  abc 10 
kate  abc 11 
kate  abc 12 
kate  abc 13 

我有以下代碼找出多少用戶有:

def self.number_of_users 
    _sheet = @book.worksheet(0) 
    _reference_row = _sheet.row(1)  #rows are zero index based in spreadsheet gem 
    @users += 1       #initialized to 0 at beginning of class 
    _sheet.each 1 do |row|    #starting the do each at row 2 of .xls 
     if row[0] != _reference_row[0] #[] for column access 
     @users += 1 
     puts row[0]      #print statements for check 
     puts _reference_row[0]   #... 
     end 
    end 
    puts @users 
end 

而不是最終打印4,我得到10!我很困惑。

回答

1

在你的代碼中,引用[0]保持'bob'。更新reference_row。

def self.number_of_users 
    _sheet = @book.worksheet(0) 
    _reference_row = _sheet.row(1)  #rows are zero index based in spreadsheet gem 
    @users += 1       #initialized to 0 at beginning of class 
    _sheet.each 1 do |row|    #starting the do each at row 2 of .xls 
     if row[0] != _reference_row[0] #[] for column access 
     @users += 1 
     _reference_row = row   ### UPDATE _reference_row here 
     puts row[0]      #print statements for check 
     puts _reference_row[0]   #... 
     end 
    end 
    puts @users 
end 

或者你可以不喜歡這樣。這更像Ruby的方式。

def self.number_of_users 
    sheet = @book.worksheet(0) 
    puts sheet.row(1..-1).map(&:first).uniq.count 
end 
  • 行(1 ..- 1)得到的行1至最後一個(-1表示像sheet.size()-1)
  • 地圖(&:第一)獲取陣列的第一項
  • 通常我們不會使用下劃線,例如val或私有值val,如Java