Например, у меня есть txt-файл с 10 строками текста. Как я могу прочитать первые 5 строк этого текста с помощью erlang?Erlang читает из файла первые 5 строк
спасибо.
Например, у меня есть txt-файл с 10 строками текста. Как я могу прочитать первые 5 строк этого текста с помощью erlang?Erlang читает из файла первые 5 строк
спасибо.
Вероятно, вы хотите сочетание 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>
использование io модуль 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 линий
Я вижу, что вы упомянули строку или это строки, которые вы намеревались сказать ??? Если это строка .. затем прочитайте первую строку и отметьте ее с помощью строкового модуля erlang .... или используйте бит-операции классического стиля функционального программирования :) – Arunmu
Это читает термины, а не строки :-) «Читает термин« Срок » 'из стандартного ввода (' IoDevice'), запрашивая его с помощью 'Prompt'. –
@ Yasir: ohhk..thanks за то, что я заметил, что .. я отредактировал свой код .. – Arunmu
Другим решением, 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]).
@OP : Вас попросят принять ответ, если какой-либо ответ отвечен на ваш вопрос, и вы удовлетворены wi го его. – Arunmu
@ArunMu: пользователь увидит комментарий, добавленный к своему сообщению, даже если перед ним нет '@'. ;-) –