2011-02-05 3 views
6

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

спасибо.

+0

@OP : Вас попросят принять ответ, если какой-либо ответ отвечен на ваш вопрос, и вы удовлетворены wi го его. – Arunmu

+0

@ArunMu: пользователь увидит комментарий, добавленный к своему сообщению, даже если перед ним нет '@'. ;-) –

ответ

8

Вероятно, вы хотите сочетание 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> 
1

использование 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 линий

+0

Я вижу, что вы упомянули строку или это строки, которые вы намеревались сказать ??? Если это строка .. затем прочитайте первую строку и отметьте ее с помощью строкового модуля erlang .... или используйте бит-операции классического стиля функционального программирования :) – Arunmu

+0

Это читает термины, а не строки :-) «Читает термин« Срок » 'из стандартного ввода (' IoDevice'), запрашивая его с помощью 'Prompt'. –

+0

@ Yasir: ohhk..thanks за то, что я заметил, что .. я отредактировал свой код .. – Arunmu

2

Другим решением, 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]).