ruby-on-rails - Ruby CSV 解析计数列标题

标签 ruby-on-rails ruby csv

我有这个 CSV 文件:

col1,  col2,     col3,     col4, col5
name1, contact1, addr, ess1, zip1, comment1    <==
name2, contact2, address2, zip2, comment2
name3, contact3, address3, zip3, comment3

当我计算列数时:

columns = CSV.read(file_path, headers: true).headers

当第二行(第一条记录/行)的列数多于列标题数时,这将返回较大的数字:6

打印标题:col1、col2、col3、col4、col5、nil

我想正确计算 CSV 列标题,以便将其与每条记录/行的列数进行比较。

columns = CSV.read(file_path, headers: true).headers
logger.info("COLUMN NAMES: #{columns.inspect}")
logger.info("COLUMN COUNT: #{columns.count}")

CSV.foreach(file_path, option) do |row|
  # Check if a row columns matches file column headers count
  if row.count != columns.count
    logger.info("Error: Row count not match.")
    File.delete(lock_file)
    exit
  end
end

我想在保存记录之前将 COLUMN HEADERS COUNTRECORD COLUMNS COUNT 匹配。如果记录的列多于标题,则可能会在记录中的某处出现逗号 ,

这也可能意味着用户提供了无效的记录数据,并且记录列将与数据库表中的每个字段不匹配。

最佳答案

只要您在任何其他行中有额外的列,您的标题中总是会得到 nil,因此,由于第一行中有 6 列,您将得到:

col1, col2, col3, col4, col5, nil

一个解决方案是删除在 headers 数组末尾找到的所有 nil 值,如下所示:

columns = CSV.read(file_path, headers: true).headers
columns.pop while columns.last.nil?

# ...

现在,在您的示例中,您将获得以下 header :

col1, col2, col3, col4, col5

计数将为 5,因此您的代码现在应该可以按预期工作。

关于ruby-on-rails - Ruby CSV 解析计数列标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44192138/

相关文章:

ruby-on-rails - 如何根据从下拉菜单中选择的值隐藏 Rails 3 表单的一部分

ruby-on-rails - 使用 curl、params 数组测试 rails grape API

ruby - 是否有 Queue 的替代方案可以让您一次弹出多个结果?

ruby-on-rails - 如何使用 has_one 创建关联记录和修改数据

list - 如何将列表转换为带有标题和相应值的 CSV 文本文件?

php - 如何正确地将数据从*.csv文件导入到mysql数据库中的给定表

ruby-on-rails - 找不到要使用 Capybara + Rails3 单击的元素

ruby-on-rails - Rails (RoR) ActiveRecord 自定义验证

ruby - Sinatra 同步 - NoMethodError at/

python - numpy loadtxt 跳过第一行