Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 未获取CSV文件中每行的正确值_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 未获取CSV文件中每行的正确值

Ruby on rails 未获取CSV文件中每行的正确值,ruby-on-rails,ruby,Ruby On Rails,Ruby,CSV: 代码: 我想得到每一个名字和年龄,但它不能正常工作。在中设置:headers=>true会导致foreach为每一行生成一个对象,而不是一个普通的Ruby数组。有关更多信息,请参阅文档 要访问实际的行字段,您需要使用row.fields: CSV.foreach(filename, :headers => true) do |row| name, age = row puts name # expected Jack, but getting ["name", "Jack"]

CSV:

代码:


我想得到每一个名字和年龄,但它不能正常工作。

在中设置
:headers=>true
会导致
foreach
为每一行生成一个对象,而不是一个普通的Ruby数组。有关更多信息,请参阅文档

要访问实际的行字段,您需要使用
row.fields

CSV.foreach(filename, :headers => true) do |row|
 name, age = row
 puts name # expected Jack, but getting ["name", "Jack"]
end

我不知道有什么方法可以跳过标题,使用
CSV.foreach
,并且仍然为每一行获取一个普通数组。

name,age=row.fields
的缺点是它要求标题按特定顺序排列(
'name'
后跟
'age'
)。通常在使用CSV文件时,您不应该关心标题的顺序

让我们创建文件:

CSV.foreach(filename, :headers => true) do |row|
 name, age = row.fields
 puts name
end
您可以编写以下内容:

filename = 't.csv'
File.write(filename,s)
  #=> 24
显示

require 'csv'

CSV.foreach(filename, :headers => true) do |row|
  age, name = row.values_at('age', 'name')
  puts name
  puts age
end
显然,我本可以写:

Jack
38
Tom
43
看。或者(更好),您可以简单地写:

name, age = row.values_at('name', 'age')

请参阅。

能否指定您使用的是哪个版本的Ruby?您得到的确切控制台输出是什么?您还可以使用
行来_a
。我希望
字段的别名,反之亦然。@yu coder,如果标题是
'a'
'b'
'c'
'd'
'e'
,并且您想要
'e'
'b'
的值,您可以写
b,e=row。值u在('b','e')
'ub,e=行。字段
。这一部分是类似的,但前者的工作方式与标题的顺序无关。此外,如果我们得到感兴趣的标题的数组
arr
,按照特定的顺序(例如,
arr=['e','c']
),我们可以编写
put row.values在(*arr)
arr.each{header |放置行[header]}
,而这在使用
字段时是有问题的。非常感谢。
Jack
38
Tom
43
name, age = row.values_at('name', 'age')
CSV.foreach(filename, :headers => true) do |row|
  puts row['name']
  puts row['age']
end