ruby - 如何从 CSV.read 中的 CSV 文件中获取标题,而 ruby​​ 中只有标题行

标签 ruby csv

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

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

对于仅包含标题行的 csv 文件,使用 headers:true, return_headers: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 文件,我必须始终有第二行,因为我的程序打算在它的基础上构建。我究竟做错了什么?这是预期的行为,还是我的设置有问题?我是否必须只读取标题,然后再读取一次以获得我想要的行为?我已经搜索了很长一段时间,但仍然遇到问题

最佳答案

您所经历的行为是正常的。两年前有一个有点类似的问题 answer that pointed out the same issue你有。那个人开了一个bug report for Ruby Ruby 开发人员做出回应并拒绝了它。据一些人称,这在技术上并不是格式良好的 CSV。

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

作为问题的快速解决方案,我只需传递 return_headers: true 并勉强跳过结果中的第一个条目,该条目始终是标题行。

关于ruby - 如何从 CSV.read 中的 CSV 文件中获取标题,而 ruby​​ 中只有标题行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37580055/

相关文章:

ruby-on-rails - 停用 Gem - "you have already activated rake 0.9.3.beta.1, but my Gemfile requires rake 0.9.2"

ruby-on-rails - 尝试使用 Destroy 时没有路由匹配 [POST] "/coachings/4"

# 分隔记录的 Java 正则表达式

linux - 仅从 CSV 文件的第 2 行和第 3 行中删除多余的逗号

ruby - 如何使用 array#each 将数组的元素相乘?

mysql - gem mysql2 gem 未加载

python - 在这种情况下,为什么 read_csv skiprows 值需要低于应有的值?

python - Python 中的 CSV 文本清理和比较

python - 我无法在 Python 中读取 csv 文件。结果有很多行而不是单元格

ruby-on-rails - 测试函数包含 API 请求