从 HTTP::响应中高效读取 CSV



我想从HTTP::Response::body读取带有标头的CSV,而无需将全部内容拉入内存。

CSV.new需要StringIO。现在我必须将响应体变成一个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

最新更新