Last active
May 16, 2017 14:24
-
-
Save quanon/7eb17d7e3162a51bf68d8abe2863c23a to your computer and use it in GitHub Desktop.
巨大なテキストファイルを最終行から each_line する
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| あいうえお | |
| かきくけこ | |
| さしすせそ | |
| たちつてと | |
| なにぬねの | |
| はひふへほ | |
| まみむめも | |
| や ゆ よ | |
| らりるれろ | |
| わ を | |
| ん | |
| アイウエオ | |
| カキクケコ | |
| サシスセソ | |
| タチツテト | |
| ナニヌネノ | |
| ハヒフヘホ | |
| マミムメモ | |
| ヤ ユ ヨ | |
| ラリルレロ | |
| ワ ヲ | |
| ン |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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