在 Ruby 中读取大 XLSX 文件第一行的最快方法

Fastest way to read the first row of big XLSX file in Ruby

我需要能够在 Rails 应用程序的 Ruby 中非常快速地读取大 xlsx 文件(350k x 12 单元格,~30MB)中的第一行(header) . 我目前正在使用 Roo gem,这适用于较小的文件。但是对于这么大的文件,需要 3-4 分钟。有没有办法在几秒钟内完成此操作?

xlsx = Roo::Spreadsheet.open(file_path)
sheet = xlsx.sheet(0)
header = sheet.row(1)

编辑:

编辑2:

使用 #gets 可能有效,可能类似于:

first_line_data = File.open(file_path, "rb", &:gets)
first_line_file = File.open("tmp_file.xlsx", "wb") { |f| f << first_line_data }
xlsx = Roo::Spreadsheet.open("tmp_file.xlsx")
# etc...

rubygemroo不支持文件流;它将整个文件读入内存。正如您所说,它适用于较小的文件,但不适用于读取大文件的一小部分。

您需要使用不同的 library/approach。例如,您可以使用 gem: creek,它将自己描述为:

a Ruby gem that provides a fast, simple and efficient method of parsing large Excel (xlsx and xlsm) files.

并且,以项目自述文件中的示例为例,将您为 roo 编写的代码转换为使用 creek:

的代码非常简单
require 'creek'
creek = Creek::Book.new(file_path)
sheet = creek.sheets[0]
header = sheet.rows[0]

注意:快速 google 您的 Whosebug 问题标题使我将 this blog post 作为最热门的搜索结果。总是值得先在 Google 上搜索。