【问题标题】:Ruby - Creating a file in memoryRuby - 在内存中创建文件
【发布时间】:2013-01-07 11:10:23
【问题描述】:

在不将文件写入磁盘的情况下,是否可以在 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 附加一个文件并发送电子邮件,所以它需要是一个文件...

【问题讨论】:

  • 所以你想要一串逗号分隔的值?那时你需要 csv 吗?你能用逗号连接你的列,用换行符连接你的行吗?
  • 哦,sendreport 函数发送一封带有 csv 文件的邮件。所以我真的需要它成为一个文件......
  • 你是说sendreport方法从磁盘读取文件?
  • 正确.. 它从光盘中读取文件并将其附加到电子邮件中。现在的问题是,是否有办法将文件作为文件保存在内存中。
  • 如果您无法更改Reports,那么您可能正在以正确的方式进行操作。获得一段内存来假装它是一个磁盘,这样Reports 可以从中读取,这可能比它的价值更麻烦。

标签: ruby csv io


【解决方案1】:
temp_file = CSV.generate do |csv|
  csv << data_for_report
end

Reports.sendreport users temp_file

【讨论】:

    【解决方案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

    【讨论】:

      【解决方案3】:

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

      但我认为 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
      

      【讨论】:

      • 又近了一步。。谢谢!
      • 请注意,它是Tempfile,而不是TempFile
      • Ruby 文档的链接已损坏
      【解决方案4】:

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

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

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

      【讨论】:

      • 我将研究 StringIO,认为这可能是我正在寻找的... Reports.sendreport 实际上只是我自己对 gmail gem 的包装,所以我不确定我是否需要一个如果或如果 StringIO 将起作用,则为真实。
      猜你喜欢
      • 1970-01-01
      • 2018-11-28
      • 2014-12-12
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      相关资源
      最近更新 更多