2011-11-29 69 views
0

我有驗證CSV文件是否正確的代碼。我想編寫慣用代碼來檢查列是否正確。我不想寫在塊檢查,如果我們有第一線檢查列。CSV驗證列

CSV.foreach(@csv) { |person| 
    first_name, last_name, person_id, email, title, phone, mobile, department, address, city = person[0..9] 
    zip_code, state, country, manager_id =person[10..13] 
    @managers << manager_id 
    @persons << person_id 

    validate = false unless validate_email(email) 
    validate = false unless validate_first_name(first_name) 
    validate = false unless validate_last_name(last_name) 
    validate = false unless validate_person_id(person_id) 
} 

回答

1

CSV是否有標題或可以添加它們?如果是的話,你可以做CSV.foreach(@csv, :headers => true)並獲得像person['first_name']這樣的列值。然後在最後的檢查成爲

​​

這就是說,它似乎是在結束整個驗證可以寫成

validate_email(person['email']) && validate_first_name(person['first_name']) etc. 
0

+1邁克爾的建議爲:headers => true

但如果你想驗證在你的例子中的所有命名字段,並瞄準DRY(雖然,無可否認,可能有點太聰明的可維護性),你可以使用Enumerable#inject

CSV.foreach(@cvs, :headers => true) { |person| 
    @managers << person[:manager_id] 
    @persons << person[:person_id] 

    # Array of columns to be validated 
    validate_cols = [:first_name, :last_name, :person_id, :email, :title, :phone, 
      :mobile, :department, :address, :city, :zip_code, :state, 
      :country, :manager_id] 

    valid = validate_cols.inject(true){|valid_sum, col| 
    valid_sum && send("validate_#{col}", person[col]) 
    } 
} 

這假定您有陣列中指定的每列的validate_*方法。