获取S3上托管的文件的行数

时间:2013-07-26 17:21:41

标签: ruby amazon-web-services amazon-s3 chunking

我们允许人们将文件上传到S3,然后我们显示该文件中有多少行的行数。我们通过运行从S3获取文件的后台进程(DelayedJob)然后计算文档中的换行数来完成此操作。总的来说,这很好用。

以下是完成工作的代码:

  def self.line_count_from_s3(options={})

    options = { :key => options } if options.is_a?(String)

    line_count = 0

    unless options[:key]
      raise ArgumentError, 'A valid S3 key is required.'
    end

    s3 = AWS::S3.new
    file = s3.buckets[ENV['S3_BUCKET']].objects[options[:key]]

    unless file.exists?
      raise IOError, 'Unable to load that import from S3. Key does not exist.'
    end

    # Stream download chunks of the file instead of loading it all into memory
    file.read do |chunk|
      # Normalize line endings
      chunk.gsub!(/\r\n?/, "\n")
      line_count += chunk.scan("\n").count
    end
    # Don't count the empty newline (assumes there is one)
    line_count -= 1 if line_count > 0

    line_count
  end

出于某种原因,一些文件出现完全错误的行数。例如,具有10,000行的文件显示为行数为40,000。这不一致。大多数文件都可以正常工作。

我正在试图弄清楚这是否可能是由S3分块阅读器的工作方式引起的,或者是否有其他因素导致问题。知道为什么记录重要是错的?有没有更好的方法来做到这一点,我不知道?

1 个答案:

答案 0 :(得分:-1)

我不知道为什么要将line_count初始化为0并执行+=。你不需要它。你的计算程序将简化为:

file.read do |chunk|
  chunk.gsub!(/\r\n?/, "\n")
  line_count = chunk.count("\n")
end