如何从CSV文件中的CSV.read获取标题,只在ruby中使用标题行

时间:2016-06-01 22:52:36

标签: ruby csv

所以,我一直在使用Ruby中的CSV文件,我遇到了一个问题。在我的测试中,对仅包含标题行的文件调用x = CSV.read(file,headers:true)将返回一个表,当转换为数组时,返回[[]],并调用x .headers返回[]。我可以通过设置return_headers来解决这个问题:true,但我实际上并不希望文件返回它的标题,我只想要标题。当我添加假的第二行时,x.headers实际上返回标题,并且:return_headers不需要设置为true。

以下是添加行之前和之后的一些代码,以帮助可视化问题。

标题:true,return_headers:在仅包含标题行的csv文件中为true:

a = CSV.read("June.csv", headers:true, return_headers:true) # <CSV::Table mode:col_or_row row_count:1>
a[0] # <CSV::Row "Day":"Day" "Time":"Time">
a.headers # => ["Day", "Time"]

只有标题:在仅包含标题行的csv文件中为true:

b = CSV.read("June.csv", headers:true) #<CSV::Table mode:col_or_row row_count:1>
b[0] # => nil
b.headers # => []

只有标题:在带有假第二行的csv文件中为true:

c = CSV.read("June.csv", headers:true) #<CSV::Table mode:col_or_row row_count:2>
c.headers # => ["Day", "Time"]
c["Day"] # => ["6/1"]

我不能依赖CSV文件,我必须总是有第二行,因为我的程序打算在它上构建。我究竟做错了什么?这是预期的行为,还是我的设置中的问题,不知何故?我是否必须为标题执行读取,然后另一个读取以获取我想要的行为?我已经搜索了一段时间,但我仍然遇到了麻烦

1 个答案:

答案 0 :(得分:2)

您遇到的行为是预期的。两年前有一个类似的问题,你有answer that pointed out the same issue。那个人打开了bug report for Ruby,Ruby开发者回应并拒绝了它。根据一些技术上不是格式良好的人的说法。

但是,我同意你和打开错误的人。 d选项应填写headers: true,无论以下行中是否存在实际数据。当前的行为似乎令人困惑,只会导致代码中的错误。

作为您问题的快速解决方案,我只需传递CSV.headers并不情愿地跳过结果中的第一个条目,它始终是标题行。