gpt4 book ai didi

ruby-on-rails - 使用 CSV 库时流关闭 IO 错误

转载 作者:数据小太阳 更新时间:2023-10-29 07:52:43 26 4
gpt4 key购买 nike

我正在尝试通过使用 CSV 库解析 CSV 文件来获取哈希数组。

我目前有这个方法有效:

def rows
rows = []

CSV.foreach(@csv_file.path, headers: true) do |row|
rows << row.to_hash
end

rows
end

但是当我将其更改为此时,我得到了stream closed 错误。

def rows
CSV.foreach(@csv_file.path, headers: true).map(&:to_hash)
end

谢谢

最佳答案

如果您查看 ::foreach 的源代码:

def self.foreach(path, options = Hash.new, &block)
encoding = options.delete(:encoding)
mode = "rb"
mode << ":#{encoding}" if encoding
open(path, mode, options) do |csv|
csv.each(&block)
end
end

它在内部使用 CSV::open 打开文件, 用一个 block 。因此,一旦 block 关闭,IO 对象就会在内部关闭。现在,当您尝试访问已关闭的 IO 对象时,您收到了错误。

来自 CSV::open 的文档

This method works like Ruby’s open() call, in that it will pass a CSV object to a provided block and close it when the block terminates,...

::foreach 返回的IO 对象实际上是由CSV::open 返回的,在def self 方法中.foreach ...

示例:

2.1.0 :016 > require 'csv'
=> true
2.1.0 :017 > CSV.open("Gemfile")
=> <#CSV io_type:File io_path:"Gemfile" encoding:UTF-8 lineno:0 col_sep:"," row_sep:"\n" quote_char:"\"">
2.1.0 :018 > CSV.open("Gemfile") { |c| c }
=> <#CSV io_type:File io_path:"Gemfile" encoding:UTF-8 lineno:0 col_sep:"," row_sep:"\n" quote_char:"\"">
2.1.0 :019 > CSV.open("Gemfile") { |c| c }.read
IOError: closed stream

关于ruby-on-rails - 使用 CSV 库时流关闭 IO 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23931539/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com