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

Ruby 获取S3上托管的文件的行数,ruby,amazon-web-services,amazon-s3,chunking,Ruby,Amazon Web Services,Amazon S3,Chunking,我们允许人们将文件上传到S3,然后显示文件中的行数。我们通过运行后台进程(DelayedJob)来实现这一点,该进程从S3获取文件,然后统计文档中的换行数。总的来说,这很有效 以下是执行此工作的代码: def self.line_count_from_s3(options={}) options = { :key => options } if options.is_a?(String) line_count = 0 unless options[:key

我们允许人们将文件上传到S3,然后显示文件中的行数。我们通过运行后台进程(DelayedJob)来实现这一点,该进程从S3获取文件,然后统计文档中的换行数。总的来说,这很有效

以下是执行此工作的代码:

  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
出于某种原因,一些文件出现了完全错误的行数。例如,一个有10000行的文件显示为40000行。这是不一致的。大多数文件工作正常


我试图弄清楚这是否是由S3分块读取器的工作方式造成的,或者是其他原因造成的。你知道为什么记录计数是错误的吗?我不知道有没有更好的方法来执行此操作?

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

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

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

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

所有文件都是相同的格式吗?现在它们都是相同的CSV格式,但是,这很快就会改变。至于文件编码,它们通常是UTF8、win32或ASCII文件。我们使用gsub(/\r\n?/,“\n”)在对文件块中的行结尾进行计数之前对其进行规范化。同一文件是否始终产生相同的错误计数。你有没有试过不在适当的地方突变区块?看起来net/http假定您不会修改此缓冲区,因此可能会导致问题。我尝试使用AWS lambda执行相同的操作,因此每当文件到达时,它都会计算记录数,我在python中运行shell命令,并且出现错误“OSError:[Errno 7]参数列表太长”。你找到没有错误的方法了吗?所有的文件都是相同的格式吗?现在它们都是相同的CSV格式,但是,这很快就会改变。至于文件编码,它们通常是UTF8、win32或ASCII文件。我们使用gsub(/\r\n?/,“\n”)在对文件块中的行结尾进行计数之前对其进行规范化。同一文件是否始终产生相同的错误计数。你有没有试过不在适当的地方突变区块?看起来net/http假定您不会修改此缓冲区,因此可能会导致问题。我尝试使用AWS lambda执行相同的操作,因此每当文件到达时,它都会计算记录数,我在python中运行shell命令,并且出现错误“OSError:[Errno 7]参数列表太长”。你找到没有错误的方法了吗?我们分块读取文件,而不是一次读取整个文件。我的印象是,每个块只代表文件的一部分,这就是为什么我们将每个块的行数加在一起。不是吗?我明白了。但是我没有看到任何例程在块上进行迭代。如果你将一个块传递给S3Object.read,它会自动将下载分块:我们分块读取文件,而不是一次读取整个文件。我的印象是,每个块只代表文件的一部分,这就是为什么我们将每个块的行数加在一起。不是吗?我明白了。但我看不到任何例程会对块进行迭代。如果将块传递给S3Object.read,它会自动对下载进行分块: