在 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)
编辑:
- 我尝试了其他 gems:
- rubyXL 花了几分钟
- creek 是最快的,用了 30 秒。但在控制器中仍然无法使用
编辑2:
- 我最终在工作中使用了 creek,并在控制器中轮询结果。感谢 Tom Lord 建议小溪
使用 #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 上搜索。
我需要能够在 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)
编辑:
- 我尝试了其他 gems:
- rubyXL 花了几分钟
- creek 是最快的,用了 30 秒。但在控制器中仍然无法使用
编辑2:
- 我最终在工作中使用了 creek,并在控制器中轮询结果。感谢 Tom Lord 建议小溪
使用 #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 上搜索。