3

我正在读取一个可以包含任意行数的文件。

我只需要保存前 1000 个左右,作为变量“ recordsToParse”传入。

如果我达到我的 1000 行限制或任何设置,我需要将预告片信息保存在文件中以进行验证total_recordstotal_amount

所以,我需要一种方法来将我的“指针”从我在文件中的位置移动到最后一行,然后再运行一次。

file = File.open(file_name)

parsed_file_rows = Array.new
successful_records, failed_records = 0, 0
file_contract = file_contract['File_Contract']
output_file_name = file_name.gsub(/.TXT|.txt|.dat|.DAT/,'')

file.each do |line|
  line.chomp!
  line_contract = determine_row_type(file_contract, line)

  if line_contract
    parsed_row = parse_row_by_contract(line_contract, line)
    parsed_file_rows << parsed_row
    successful_records += 1
  else
    failed_records += 1
  end

  if (not recordsToParse.nil?)
    if successful_records > recordsToParse
      # move "pointer" to last line and go through loop once more
      #break;
    end
  end

end
store_parsed_file('Parsed_File',"#{output_file_name}_parsed", parsed_file_rows)
[successful_records, failed_records]
4

2 回答 2

4

使用IO.seekwithIO::SEEK_END将指针移动到文件末尾,然后向上移动到最后一个 CR,然后你就有了最后一行。

仅当文件非常大时才值得这样做,否则只需跟随file.each do |line|到最后一行,或者您可以像这样阅读最后一行IO.readlines("file.txt")[-1]

最简单的解决方案是使用像 elif 这样的 gem

require "elif"

lastline = Elif.open("bigfile.txt") { |f| f.gets }

毫无疑问,它会使用 seek 快速读取您的最后一行。

于 2012-08-17T18:40:57.133 回答
0

这是我利用操作系统headtail命令的时候之一,使用类似的东西:

head = `head -#{ records_to_parse } #{ file_to_read }`.split("\n")
tail = `tail -1 #{ file_to_read }

head.pop if (head[-1] == tail.chomp)

然后用类似的东西写出来:

File.open(new_file_to_write, 'w') do |fo|
  fo.puts head, tail
end
于 2012-08-17T21:19:15.730 回答