如何将特定元素从csv存储到变量中?

时间:2018-07-16 06:34:06

标签: arrays ruby csv variables

我有一个名为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

2 个答案:

答案 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"]*.