2011-11-29 47 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_*方法。