首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遍历CSV::Rows

遍历CSV::Rows
EN

Stack Overflow用户
提问于 2019-09-26 06:22:25
回答 3查看 1K关注 0票数 0

我要开始说我还在学习ruby。

我正在编写一个脚本来解析.csv并识别数据集中可能存在的重复记录。

我有一个带有标题的.csv文件,所以我正在解析数据,以便可以使用标题访问每一行,如下所示:

代码语言:javascript
复制
@contact_table = CSV.parse(File.read("app/data/file.csv"), headers: true)

# Prints all last names in table
puts contact_table['last_name']

我正在尝试迭代表中的每一行,并确定我当前迭代的姓氏是否与下一个姓氏相似,但我在执行此操作时遇到了问题。我猜我处理它的方式就好像它是一个数组,但我检查了它的类型,它是一个CSV::Row。

示例(这不起作用):

代码语言:javascript
复制
@contact_table.each_with_index do |c, i|
  puts "first contact is #{c['last_name']}, second contact is #{c[i + 1]['last_name']}"
end

我意识到这不是这样工作的,因为表不是一个数组,它是一个CSV::Row,就像我之前提到的那样。有什么方法可以做到这一点吗?我现在真的想不起来了。

我的csv看起来像这样:

代码语言:javascript
复制
id,first_name,last_name,company,email,address1,address2,zip,city,state_long,state,phone
1,Donalt,Canter,Gottlieb Group,dcanter0@nydailynews.com,9 Homewood Alley,,50335,Des Moines,Iowa,IA,515-601-4495
2,Daphene,McArthur,"West, Schimmel and Rath",dmcarthur1@twitter.com,43 Grover Parkway,,30311,Atlanta,Georgia,GA,770-271-7837
EN

回答 3

Stack Overflow用户

发布于 2019-09-26 07:01:59

@contact_table应该是一个CSV::Table,它是CSV::Row的集合,所以在下面:

代码语言:javascript
复制
@contact_table.each_with_index do |c, i|
  ...
end

c是一个CSV::Row。这就是c['last_name']工作的原因。这里的问题是:

代码语言:javascript
复制
c[i + 1]['last_name']

您看到的是c (单行),而不是@contact_table,如果您说:

代码语言:javascript
复制
@contact_table[i + 1]['last_name']

然后,您将获得下一个姓氏,或者,当c是最后一行时,由于@contact_table[i+1]将为nil,因此是一个异常。

此外,在迭代中,c是当前行(或(i+1)行),并不总是第一行。

票数 3
EN

Stack Overflow用户

发布于 2019-09-26 11:38:32

你的用例是什么?看起来像是学校的项目?

我建议使用for_each而不是parse (参见this comparison)。我可能会使用Set来实现这一点。

  • 在解析文件的范围之外(即在解析代码之上)创建一个集合。让我们在每次迭代期间将其称为rows.
  • Call rows.include?(row),同时解析文件
    • 如果为true,则您知道您有一个重复的
    • 如果为false,则调用rows.add(row)向set

添加新行

您也可以使用必须不同的列(例如,row.field(:some_column_name))中的单个值填充您的集合,例如电子邮件或电话号码,并对其执行相同的包含检查。

(如果这是一个真实的应用程序,请不要这样做。改为使用模型validations。)

票数 1
EN

Stack Overflow用户

发布于 2019-09-26 16:59:15

我会使用#read而不是#parse,并这样做:

代码语言:javascript
复制
require 'csv'
LASTNAME_INDEX = 2
data = CSV.read('data.csv')

data[1..-1].each_with_index do |row, index|
  puts "Contact number #{index + 1} has the following last name : #{row[LASTNAME_INDEX]}"
end

#~> Contact number 1 has the following last name : Canter
#~> Contact number 2 has the following last name : McArthur
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58107288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档