1

我在 Ruby 中实现,我只想读取 CSV 文件。我的 CSV 看起来像:

"official_code","username","lastname","firstname","email","Course Groups","password"
"1626","000078sr","LENS","Ser","blab@hogent.be","project1g43","pwd7975"
"7334","000116jd","DE ","Joen","je0116@.hogent.be","project1g08","pwd5259"
"2003","000136bv","VACKE","Bert","hogent.be","project1g18","pwd5908"
"4065","000166cr","ROHøJ","Chrian","chrhogent.be","project1g10","pwd5000"

它是在 Excel 中制作并设置在 CSV 文件中

但是当我在我的应用程序中这样做时:

 FasterCSV.foreach(file.path, {:headers=>true }) do |row|

            @samples[i] = row
      i += 1
    end # do

 if @samples.size > 0
      @headers = @samples[0].headers
    end 

在我看来,我只是这样做:

<%= @headers.inspect %>


<ul>
<% @samples.each do |a| %>
<li>
<%= a %>
</li>
<% end %>
</ul>

我得到:

["\"official_code\",\"username\",\"lastname\",\"firstname\",\"email\",\"Course Groups\",\"password\""]

"""1626"",""000078sr"",""ENS"",""Sder"",""san.hogent.be"",""project1g43"",""pwd7975"""
"""7334"",""000116jd"",""DE VOS"",""Jen"",""jeroen.ogent.be"",""project1g08"",""pwd5259"""
"""2003"",""000136bv"",""VYCKE"",""Bet"",""berent.hogent.be"",""project1g18"",""pwd5908"""
"""4065"",""000166cr"",""ROøJ"",""Chstian"",""chr.hogent.be"",""project1g10"",""pwd5000"""

所以有很多 " 的方法。有人知道我做错了什么吗?就像行只有 1 列。如果我这样做,samples[0].each我只会得到 1 项。整行而不是列。

4

1 回答 1

0

当您引用时,@samples您正在查看一个rows数组,每个 rows 都是一个已解析字段的数组。

因此,当您使用 时@samples.each do |a|a是一行,我认为您会得到调用#inspect该行的结果。

如果你尝试这样的事情会发生什么?

options = { :headers=>true, :return_headers => true }
@samples = FasterCSV.read(file.path, options).to_a

if @samples.size > 0
  @headers = @samples.shift 
end 

:return_headers=>true如果您想获得实际标签,则需要;:headers=>true只告诉 FasterCSV 有标题 - 默认情况下会丢弃它们。FasterCSV.read一键获取并解析所有数据,这比自己构建数组更简单。请注意to_a最后的 ,这迫使结果实际上是一个数组 - 它可能会使下一部分的事情变得更简单。

如果您按如下方式修改视图(在标题上使用#join而不是在行上添加 a)会发生什么?#inspect#join

<%= @headers.join(', ') %>

<ul>
<% @samples.each do |a| %>
<li>
<%= a.join(', ') %>
</li>
<% end %>
</ul>

如果这不能解决它,希望你至少应该进一步了解正在发生的事情......

于 2011-12-01T10:33:22.423 回答