0

我有一个看起来像这样的垂直 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,它会获取该值,然后越过它并给我留下一个空变量,因为它继续到其他行。

任何人都可以帮忙吗?

4

3 回答 3

2

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

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

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

index或者,您可以读取整个数组,然后使用或选择您感兴趣的记录select

于 2013-10-30T15:34:46.790 回答
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
于 2013-10-30T20:42:30.823 回答
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变量上。

于 2013-10-30T16:36:50.687 回答