我有一个名为Energy.csv的csv文件,它非常简单:
A座150楼
B楼160
我想将csv导入Ruby并打印第二行第二列元素(160)。这是我到目前为止的内容,但是我不知道如何改进此代码。
require 'csv'
class CSVImport
energyusageA = Array.new
energyusageB = Array.new
CSV.foreach('CSV/Energy.csv') do |row|
energyusageA = row[1]
energyusageB = row[2]
end
puts energyusageB[1]
end
答案 0 :(得分:3)
如果文件很小且内存不受限制,则要快速阅读此内容:
CSV.open('CSV/energy.csv').read[1][1]
将第二行的第二个值作为Ruby中所有零索引的位置。
在您的代码中,您已将其包装在class
定义内,但是除非您定义方法,否则这实际上没有任何意义。是的,您可以在那种情况下在其中运行可执行代码,但这仅适用于元编程等其他情况。
Ruby风格的设计如下:
class CSVReader
def initialize(path)
@path = path
end
def value(row: 1, col: 1)
CSV.open(@path).read[row][col]
end
end
在哪里可以这样称呼:
CSVReader.new('CSV/energy.csv').value
CSVReader.new('CSV/energy.csv').value(row: 4, col: 2)
以此类推。
答案 1 :(得分:0)
我认为你很亲密。
要获得第二行,您可以按照以下方式进行操作:
require 'CSV'
second_row = Array.new
CSV.foreach('energy.csv') do | row |
second_row << row[1]
end
要获取第二个元素,您只需要访问第二个列元素(因为ruby基于0,所以它是1
):
second_row[1]
将为您打印=>"160"
。
编辑,我想我需要再解释一件事。 =
(分配)和<<
(附加)之间的区别。
=
将变量分配在右侧。
<<
将右侧附加到数组的末尾。
您可以在以下测试中进行尝试:
test = Array.new
test = 'Yo' => this assigns string to the test (*"Yo\n"* will be stored in the *test8 variable)
OR
test << 'Yo' => this appends to the empty array the string 'Yo' so the *Array* will look like this *["Yo"]*.