如何从CSV获取特定行值?

时间:2013-10-30 15:23:00

标签: ruby csv foreach row

我有一个垂直的CSV文件,如下所示:

name,value
case,"123Case0001"
custodian,"Doe_John"
PDate,"10/30/2013"

我可以这样读取文件:

CSV.foreach("#{batch_File_Dir_cdata}", :quote_char => '"', :col_sep =>',', :row_sep =>:auto, :headers => true) do |record|
ev_info = record[0]
ev_val = record[1]

问题是,我需要针对一个特定的ev_val获得特定的ev_info。我可以使用行号,但远见告诉我这可能会改变。信息的名称将是相同的。我想找到具有特定信息名称的行并获取该值。

当我执行foreach时,它获取该值然后经过它并留下一个空变量,因为它继续到其他行。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

您有很多选择,但最简单的方法是根据内容分配变量,如:

ev_info = record[0]
ev_val = record[1] if ev_info='special name'

但请注意,您需要定义要分配给块外部的任何变量,否则它将被创建为局部变量,之后将无法访问。

或者,您可以阅读整个数组,然后使用indexselect选择您感兴趣的记录。

答案 1 :(得分:1)

我会这样做:

require 'pp'
require 'csv'

ROWS_IN_RECORD = 4

data = []
File.open('test.dat', 'r') do |fi|
  loop do
    record = {}
    ROWS_IN_RECORD.times do
      row = fi.readline.parse_csv
      record[row.first] = row.last
    end
    data << record
    break if fi.eof?
  end
end

pp data

运行输出:

[{"name"=>"value",
  "case"=>"123Case0001",
  "custodian"=>"Doe_John",
  "PDate"=>"10/30/2013"},
 {"name"=>"value_2",
  "case"=>"123Case0001 2",
  "custodian"=>"Doe_John 2",
  "PDate"=>"10/30/2013 2"}]

它返回一个哈希数组,因此如果该文件是普通的CSV文件,则每个哈希都是您通常从CSV获取的记录。

还有其他方法可以将输入文件分解为逻辑组,但这是可扩展的,只需稍作更改即可处理大量数据文件。对于一个巨大的文件,只需在循环结束时处理每个记录,而不是将其推送到data变量。

答案 2 :(得分:1)

我得到了它的工作。我原来有以下内容:

CSV.foreach("#{batch_File_Dir_cdata}", :quote_char => '"', :col_sep =>',', :row_sep =>:auto, :headers => true) do |record|
    ev_info = record[0]
    c_val = record[1]
case when ev_info == "Custodian"
 cust = cval
  end
    end
puts cust

我需要做的是:

CSV.foreach("#{batch_File_Dir_cdata}", :quote_char => '"', :col_sep =>',', :row_sep =>:auto, :headers => true) do |record|
    ev_info = record[0]
    case when ev_info == "Custodian"
    c_val = record[1]
  end
    end

puts c_val