我有一个垂直的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
时,它获取该值然后经过它并留下一个空变量,因为它继续到其他行。
有人可以帮忙吗?
答案 0 :(得分:2)
您有很多选择,但最简单的方法是根据内容分配变量,如:
ev_info = record[0]
ev_val = record[1] if ev_info='special name'
但请注意,您需要定义要分配给块外部的任何变量,否则它将被创建为局部变量,之后将无法访问。
或者,您可以阅读整个数组,然后使用index
或select
选择您感兴趣的记录。
答案 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