【问题标题】:Read file and validate rows in Ruby在 Ruby 中读取文件并验证行
【发布时间】:2015-12-02 07:20:43
【问题描述】:

我有一个 CSV 文件如下

ID      Required  -- these are headers
SD0005   Yes      -- row information

我必须根据标题验证每一行。假设 ID 包含字母和数字,长度不应超过 6。 在每一行中,必需的标题应该是是或否。

如果我必须处理一个包含 1000 多行且性能良好的大文件,如何在 Ruby 中实现此功能?

我正在阅读每个标题的特定行,如下所示

CSV.foreach('file path', :headers => true) do |csv_obj| 
csv_obj['ID'] 
csv_obj['Required']

有没有办法知道在针对行的标题验证列时哪个条件失败。我需要知道它在哪种情况下失败并打印出来

红宝石新手。感谢帮助

【问题讨论】:

  • 您需要在 ruby​​ 中进行处理。为什么你会在 javascript 中有验证码?

标签: ruby


【解决方案1】:

要将数据从 CSV 文件导入 Ruby,请尝试以下操作:

# This will read the data in with headers, convert the column names to symbols, 
# and then turn each resulting CSV::Row instance into a hash

data = CSV.read('temp.csv', headers: true, header_converters: :symbol).map(&:to_h)

这应该返回以下内容:

=> [{:id=>"SD0005", :required=>" yes"}, ...]

一旦您的所有信息都采用了可以在 Ruby 中使用的格式,您就可以创建一个方法来检查每个 ID 的有效性。

def valid_id?(id_string)
  # uses Regular Expressions to ensure ID is 6 
  # characters that consist of only numbers/letters
  # The double-bang(!!) turn a truthy value to `true`
  # or false value to `false`

  !!id_string.match(/^[\D|\d]{6}$/)
end

如果您想测试另一列的有效性,请使用单独的方法。

def valid_required?(req_column)
  req_column.downcase == 'yes' ||   req_column.downcase == 'no'
end

创建一个主验证器方法

def all_valid?(row)
  valid_id?(row[:id]) && valid_required?(row[:required])
end

然后只保留ID有效的记录

# #select keeps values whose block evaluates to `true`
valid_records = data.select { |record| all_valid?(record) }

【讨论】:

  • 我在app文件夹下的javascripts文件夹中有函数(我们创建rails项目时创建的目录结构)对于上面创建的哈希,我如何为给定行的每一列调用函数?假设我必须为 id 调用 valid_id,为 required 调用 valid_required 等等。标题中的每一列都有一个功能。然后仅当验证通过对数据库的所有行列进行验证时才存储完整的行信息。您能否更具体地说明我们如何在 ruby​​ 中编写代码?
  • 您可以创建另一个方法来检查记录的required 必需属性的有效性,例如valid_required?,然后创建一个检查所有验证的方法。例如:def all_columns_valid 内部写入valid_id? && valid_required?
  • 我鼓励您对 CSV Ruby 文档进行一些探索。它应该可以帮助您了解有助于调试这些事情的理解。如果一切都失败了,请看这里stackoverflow.com/questions/4822422/output-array-to-csv-in-ruby
  • 谢谢亚历克斯。会去看看
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 2011-01-30
  • 2010-12-02
  • 1970-01-01
相关资源
最近更新 更多