Erlang прочитал из файла первые 5 строк - PullRequest
6 голосов
/ 05 февраля 2011

Например, у меня есть текстовый файл с 10 строк текста. Как я могу прочитать первые 5 строк этого текста с помощью erlang?

Спасибо.

Ответы [ 3 ]

8 голосов
/ 05 февраля 2011

Возможно, вам нужна комбинация file:open/2 и file:read_line/1 с включенной буферизацией.

Рифма:

$ cat mary_lamb.txt
Mary had a little lamb,
little lamb, little lamb,
Mary had a little lamb,
whose fleece was white as snow.
And everywhere that Mary went,
Mary went, Mary went,
and everywhere that Mary went,
the lamb was sure to go.

Исходный файл:

$ cat ./read_n_lines.erl
-module(read_n_lines).
-export([read_n_lines/2]).

read_n_lines(Filename,NumLines) ->
     {ok, FileDev} = file:open(Filename, 
          [raw, read, read_ahead]),
     Lines = do_read([],FileDev, NumLines),
     file:close(FileDev),
     Lines.

do_read(Lines, _, 0) ->
     lists:reverse(Lines);
do_read(Lines, FileDev, L) ->
     case file:read_line(FileDev) of
          {ok, Line} ->
               do_read([Line|Lines], FileDev, L - 1);
          eof ->
               do_read(Lines, FileDev, 0)
     end.

raw в Modes, переданный в file:open/2, обеспечивает более быстрый доступ к файлу, поскольку для обработки файла не требуется процесс Erlang.

Пример выполнения:

$ erl
1> c(read_n_lines).
{ok,read_n_lines}
2> Lines = read_n_lines:read_n_lines("./mary_lamb.txt", 5).
["Mary had a little lamb,\n","little lamb, little lamb,\n",
 "Mary had a little lamb,\n",
 "whose fleece was white as snow.\n",
 "And everywhere that Mary went,\n"]
3> length(Lines).
5
4> read_n_lines:read_n_lines("./mary_lamb.txt", 666).
["Mary had a little lamb,\n","little lamb, little lamb,\n",
 "Mary had a little lamb,\n",
 "whose fleece was white as snow.\n",
 "And everywhere that Mary went,\n",
 "Mary went, Mary went,\n",
 "and everywhere that Mary went,\n",
 "the lamb was sure to go."]
5> 

Чтобы удалить символ новой строки из строки, вы можете использовать string:strip/1,2,3:

5> lists:map(fun(X) -> string:strip(X, right, $\n) end, Lines).
["Mary had a little lamb,","little lamb, little lamb,",
 "Mary had a little lamb,",
 "whose fleece was white as snow.",
 "And everywhere that Mary went,"]
6>
2 голосов
/ 08 февраля 2011

Другое решение, n_times можно использовать в других местах:

-module(n_times).

-export([test/0]).

test() ->
  io:format("~p~n", [n_lines("n_times.erl", 5)]).

n_lines(FileName, N) ->
  {ok, FileDev} = file:open(FileName, [raw, read, read_ahead]),
  try
    n_times(fun() -> {ok, L} = file:read_line(FileDev), L end, N)
  after
    file:close(FileDev)
  end.

n_times(F, N) ->
  n_times(F, N, []).

n_times(_, 0, A) ->
  lists:reverse(A);
n_times(F, N, A) ->
  n_times(F, N-1, [F()|A]).
1 голос
/ 05 февраля 2011

используйте модуль Erlang.

Io: чтение (FD, '')

.

Где FD - дескриптор файла.

Также, пожалуйста, посмотрите документацию erlang для правильного синтаксиса.

Вот примерный код

func(FD) ->
case io:get_line(FD,'') of
{ok,text}->
 %%do something,
func(FD);
eof ->
%%exit;
error->
%%quit
end

Вы можете использовать счетчик, если хотите обработать всего 10 строк

...