Erlang stream a file line by line
Erlang
-module(read_lines).
-export([fold_lines/3]).
fold_lines(Path, Fun, Acc0) ->
{ok, Io} = file:open(Path, [read, binary, {read_ahead, 65536}]),
try
loop(Io, Fun, Acc0)
after
file:close(Io)
end.
loop(Io, Fun, Acc) ->
case file:read_line(Io) of
{ok, Bin} ->
Line = string:trim(binary_to_list(Bin), trailing, "\r\n"),
loop(Io, Fun, Fun(Line, Acc));
eof -> Acc;
{error, Reason} -> error({read_failed, Reason})
end.