我有这个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 COUNT
与RECORD COLUMNS COUNT
匹配。如果记录的列数多于标题,则记录中可能会出现逗号,
。
这也可能意味着用户提供了无效的记录数据,并且记录列与数据库表中的每个字段都不匹配。
答案 0 :(得分:1)
只要在任何其他行中有额外的列,您就会始终在标题中获得nil
,因此,由于第一行中有6列,您将得到:
col1, col2, col3, col4, col5, nil
一种解决方案是删除在nil
数组末尾找到的任何headers
值,如下所示:
columns = CSV.read(file_path, headers: true).headers
columns.pop while columns.last.nil?
# ...
现在,在您的示例中,您将获得此标题:
col1, col2, col3, col4, col5
计数将为5
,因此您的代码现在应该按预期工作。