0

我需要能够在 Ruby on Rails 应用程序中非常快速地读取大 xlsx 文件(350k x 12 单元格,~30MB)中的第一行(标题)。我目前正在使用 Roo gem,这对于较小的文件来说很好。但是对于这么大的文件,它需要 3-4 分钟。有没有办法在几秒钟内做到这一点?

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

编辑:

  • 我尝试了其他宝石:
    • rubyXL 花了几分钟
    • 小溪是最快的,有 30 多岁。但在控制器中仍然无法使用

编辑2:

  • 我最终在工作中使用小溪并在控制器中轮询结果。感谢Tom Lord建议小溪
4

2 回答 2

1

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

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

一个 Ruby gem,它提供了一种快速、简单和高效的方法来解析大型 Excel(xlsx 和 xlsm)文件。

而且,以项目自述文件中的示例为例,将您编写的代码转换为roo使用的代码非常简单creek

require 'creek'
creek = Creek::Book.new(file_path)
sheet = creek.sheets[0]
header = sheet.rows[0]

注意:您的 StackOverflow 问题标题的快速 google 使我将这篇博文列为热门搜索结果。首先在谷歌上搜索总是值得的。

于 2021-12-07T16:39:57.403 回答
-1

使用#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...
于 2021-12-07T14:53:40.773 回答