22

无论如何在Ruby中编写以下代码而不将文件写入磁盘?

temp_file = 'path/to/file.csv'
users = [a@b.c, c@b.a]

CSV.open(temp_file, "w") do |csv|
  csv << data_for_report
end

Reports.sendreport users temp_file

File.delete(temp_file)

Reports.sendreport 附加一个文件并发送电子邮件,所以它需要是一个文件...

4

4 回答 4

21

你可以使用Tempfile. Tempfile将文件写入光盘,因此不符合您的要求。

但我认为 Tempfile 提供了您需要的一些功能:

当一个 Tempfile 对象被垃圾回收,或者当 Ruby 解释器退出时,它相关的临时文件会被自动删除。

例子:

require 'tempfile'
require 'csv'

data_for_report = [1,2,3,4]
temp_file = Tempfile.new('foo')

CSV.open(temp_file, "w") do |csv|
  csv << data_for_report
end
于 2013-01-23T21:47:11.293 回答
3

尝试其中一种 mmap 宝石。如果库采用文件名,那是您的选择。

但是,如果它可以接受类似文件的对象,则可以使用 StringIO。

您可能会考虑更改任何Reports内容,使其更通用。这取决于它使用什么来创建它的邮件消息——这可能是微不足道的。

于 2013-01-23T21:12:56.973 回答
2

使用您当前的代码是不可能的,如果您的代码将使用文件指针/句柄,您可以执行以下操作:

require 'csv'
require 'stringio'

data_for_report = [1,2,3,4]
temp_file = StringIO.new # creates a fake file as string.

CSV.new(temp_file, "w") do |csv|
  csv << data_for_report
end

为什么它不适用于您的用例的关键问题是行Reports.report users temp_file

如果它接受句柄而不是字符串,它将起作用。

另请参阅此 SO:https ://stackoverflow.com/a/19110958/887836

于 2019-01-07T15:00:31.753 回答
2
temp_file = CSV.generate do |csv|
  csv << data_for_report
end

Reports.sendreport users temp_file
于 2019-09-04T21:10:23.923 回答