我想从HTTP::Response::body读取带有标头的CSV,而无需将全部内容拉入内存。
CSV.new
需要String
或IO
。现在我必须将响应体变成一个String
,在解析整个事情之前,将其全部拉入内存。
CSV.new(response.body.to_s, headers: true).each do |row|
...
end
是否可以逐行读取和解析响应正文?
根据这个基准测试: https://dalibornasevic.com/posts/68-processing-large-csv-files-with-ruby
从 IO 读取的内存使用量/占用量最小,并使用CSV.new
进行了优化。
您是否考虑过使用open-uri
读取远程文件/http 端点并流式传输到CSV.new
?
像这样:
require 'open-uri'
require 'csv'
csv = CSV.new(open('https://somesite/data.csv'))
while row = csv.shift # parse one by one with minimal memory footprint
puts row.inspect
end