3

任意の数の行を含むことができるファイルを読み込んでいます。

変数""として渡された最初の1000程度を保存するだけで済みますrecordsToParse

1000行の制限、または設定されている行数に達した場合は、トレーラー情報をファイルに保存して確認する必要がありtotal_recordsますtotal_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.seekwithを使用しIO::SEEK_ENDてポインターをファイルの末尾に移動し、最後の CR まで移動すると、最後の行になります。

これは、ファイルが非常に大きい場合にのみ価値があります。それ以外の場合はfile.each do |line|、最後の行までたどるか、このように最後の行を読むことができますIO.readlines("file.txt")[-1]

最も簡単な解決策は、elif のような宝石を使用することです

require "elif"

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

間違いなくシークを使用して、最終行を一瞬で読み取ります。

于 2012-08-17T18:40:57.133 に答える
0

これは、次のようなものを使用して OSheadtailコマンドを利用するときの 1 つです。

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 に答える