Ruby 如何从CSV中获取特定的行值?

Ruby 如何从CSV中获取特定的行值?,ruby,csv,foreach,row,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

我有一个垂直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]
我可以这样读取文件:

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_info
获取一个特定的
ev_val
。我可能会使用行号,但远见告诉我这可能会改变。相同的是信息的名称。我想找到具有特定信息名称的行并获取该值

当我执行
foreach
时,它会得到该值,然后经过它,留下一个空变量,因为它会转到其他行


有人能帮忙吗?

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

ev_info = record[0]
ev_val = record[1] if ev_info='special name'
但请注意,您需要定义要分配给块外部的任何变量,否则它将被创建为局部变量,之后您将无法访问


或者,您可以读取整个数组,然后使用
index
select
选择感兴趣的记录。您有很多选择,但最简单的方法是根据内容分配变量,如:

ev_info = record[0]
ev_val = record[1] if ev_info='special name'
但请注意,您需要定义要分配给块外部的任何变量,否则它将被创建为局部变量,之后您将无法访问


或者,您可以读取整个数组,然后使用
索引
选择
选择感兴趣的记录。我会这样做:

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
它返回一个散列数组,因此如果文件是普通的CSV文件,则每个散列都是通常从CSV获取的记录


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

我会这样做:

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
它返回一个散列数组,因此如果文件是普通的CSV文件,则每个散列都是通常从CSV获取的记录


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

我让它工作了。我有以下几点:

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

我让它工作了。我有以下几点:

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

这不是CSV文件。CSV不是“垂直”,而是“水平”。一条记录由多少行组成,只有四行?这是一个csv,因为有逗号分隔的值。这不是一个传统的csv。除此之外,这不重要。如果csv有firstname,lastname,我只需要第一个名字是“Steve”的行的lastname值,这可能吗?在这里也是同样的问题。我感谢所有试图找到答案的人,但都没有成功。我还是被卡住了。这些评论让人很难看出我没有答案,所以我想确保每个人都知道我还在努力解决这个问题。这不是一个CSV文件。CSV不是“垂直”,而是“水平”。一条记录由多少行组成,只有四行?这是一个csv,因为有逗号分隔的值。这不是一个传统的csv。除此之外,这不重要。如果csv有firstname,lastname,我只需要第一个名字是“Steve”的行的lastname值,这可能吗?在这里也是同样的问题。我感谢所有试图找到答案的人,但都没有成功。我还是被卡住了。这些评论让人很难看出我没有答案,所以我想确保每个人都知道我仍在努力解决这个问题。谢谢你的回复,但这没有用。CSV.foreach(“#{batch_File_Dir_cdata}”,:quote_char=>”,:col_sep=>,,:row_sep=>:auto,:headers=>true)do | record | ev|u info=record[0]b_val=record[1]如果ev|u info==“batch”end put“{b#val}是批次名称“I get error”名称错误:未定义的局部变量或main:Object的方法“b|val”“我不明白这会有什么帮助,因为它正在csv中循环。CSV的这一行位于中间,所以在完成前文的时候,我不在第一列是我需要的那一行。除非我弄错了。这种技术允许您从行中提取/保留您想要的任何信息。在我给出的示例中,它只提取/保留
记录[1]
,但您可以提取/保留任何需要的内容,包括整个记录。至于你得到的错误,你在我发布的代码的转录中有一个打字错误。你有
b_val=…
我有
ev_val=…
的地方。这不是打字错误,我改了。我是始终如一的。如果我保持EVU val,它仍然不起作用。CSV.foreach(“#{batch#u File_Dir_cdata}”,:quote_char=>”,:col_sep=>,,,,:row_sep=>:auto,:headers=>true)do | record | ev u info=record[0]b_val=record[1]如果ev u info==“batch”end put“{b#val}是批次名称,请编辑您的问题,以包含完整代码和您收到的错误消息。您无法有效地将Ruby代码与注释中的换行符共享。如果您确实在注释中共享Ruby代码,请使用backtick操作符引用代码,并使用分号作为语句分隔符,否则您将使用换行符。感谢您的回复,但这不起作用。CSV.foreach(“#{batch_File_Dir_cdata}”,:quote_char=>”,:col_sep=>,,:row_sep=>:auto,:headers=>true)do | record | ev|u info=record[0]b_val=record[1]如果ev|u info==“batch”end put“{b#val}是批次名称“I get error”名称错误:未定义的局部变量或main:Object的方法“b|val”“我不明白这会有什么帮助,因为它正在csv中循环。CSV的这排是在中间,所以在它完成的时候