Skip to content

Instantly share code, notes, and snippets.

@quanon
Last active May 16, 2017 14:24
Show Gist options
  • Select an option

  • Save quanon/7eb17d7e3162a51bf68d8abe2863c23a to your computer and use it in GitHub Desktop.

Select an option

Save quanon/7eb17d7e3162a51bf68d8abe2863c23a to your computer and use it in GitHub Desktop.
巨大なテキストファイルを最終行から each_line する
あいうえお
かきくけこ
さしすせそ
たちつてと
なにぬねの
はひふへほ
まみむめも
や ゆ よ
らりるれろ
わ   を
アイウエオ
カキクケコ
サシスセソ
タチツテト
ナニヌネノ
ハヒフヘホ
マミムメモ
ヤ ユ ヨ
ラリルレロ
ワ   ヲ
def reverse_lines(file_path, buffer_size = 28)
Enumerator.new do |y|
File.open(file_path, 'r') do |f|
f.seek(0, IO::SEEK_END)
file_size = f.pos
remaining_size = file_size
buffer_size = [file_size, buffer_size].min
offset = 0
segment = nil
loop do
remaining_size = file_size - offset
if remaining_size <= 0
y.yield(segment) if segment
break
end
offset += buffer_size
f.seek([file_size - offset, 0].max)
buffer = f.read([remaining_size, buffer_size].min)
lines = buffer.split("\n")
if segment && buffer[-1] != "\n"
lines.last << segment
segment = nil
end
if segment
y.yield(segment)
segment = nil
end
segment = lines.shift
lines.reverse.each { |line| y.yield(line) }
end
end
end
end
reverse_lines('kana.txt').each { |line| puts(line) }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment