我解析了一个标头为ID、Name和Address的CSV文件。我需要在数据中查找具有特定ID和Name的行。找到该行后,我需要访问Address值。
data = CSV.parse(my_csv, headers: true)
rows = data.select { |row| row['ID'] == someId } //ids are not unique
row = rows.select { |row| row['Name'] == name } //names are unique
如何得到该行数据中Address
的值?row[2]
不起作用。
2条答案
按热度按时间kgqe7b3p1#
我需要在数据中查找具有特定ID和Name的行。
您可以在单个
select()
中合并任意多个条件:事实上,你可以根据自己的意愿将这个布尔语句变得简单或复杂,你需要确定得到你想要的结果所需的确切的布尔逻辑。
我需要访问地址值。
要获取所选每行的
'Address'
列,请使用map()
:要选择第一行的
'Address'
列:不过,最后一个要小心,如果
rows
为空,则会导致错误。mwngjboj2#
让我们首先创建一些测试数据。
因为
'Names'
的值是唯一的,所以我们可以使用Enumerable #find,它会在其块中的条件计算true
时立即终止。一个二个一个一个
注意,如果没有行满足阻塞条件,则
row
被分配为nil
。我们可以通过使用Safe Navigation Operator、
&
来缩短时间。注意,在使用安全导航操作符时,我们不能使用 * syntacticsugar * 版本的方法,这里
会引发异常。
如果
find_addr
返回nil
,表明数据有问题,我们可以在代码中处理,或者在上面的第二个方法中删除安全导航操作符,如果没有行满足所需的条件,这将导致引发NoMethodError
异常。