2011-02-05 31 views
6

Ví dụ: tôi có tệp txt với 10 chuỗi văn bản. Làm thế nào tôi có thể đọc 5 chuỗi đầu tiên của văn bản này với erlang?Erlang đọc từ tệp 5 hàng đầu tiên

Cảm ơn bạn.

+0

@OP : Bạn được yêu cầu chấp nhận câu trả lời, nếu có câu trả lời nào được trả lời cho câu hỏi của bạn và bạn hài lòng với wi th nó. – Arunmu

+0

@ArunMu: Người dùng sẽ thấy nhận xét, được thêm vào bài đăng của cô ấy (ngay cả khi không có '@' trước nick. ;-) –

Trả lời

8

Có lẽ bạn muốn có một sự kết hợp của file:open/2file:read_line/1 với đệm được kích hoạt.

Một vần:

$ 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. 

tập tin Nguồn:

$ 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, trong Modes, truyền cho file:open/2, cho phép truy cập nhanh hơn vào một tập tin, bởi vì không có quá trình Erlang là cần thiết để xử lý các tập tin.

mẫu chạy:

$ 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> 

Để tháo xuống dòng từ một chuỗi, bạn có thể sử dụng 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

sử dụng mô đun io của erlang.

io: đọc (FD, '').

Trong đó FD là Trình xử lý tệp.

Cũng vui lòng tra cứu tài liệu erlang để biết cú pháp chính xác.

Dưới đây là một mã thô

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

Bạn có thể sử dụng một bộ đếm nếu bạn muốn xử lý chỉ 10 dòng

+0

Tôi thấy bạn đã đề cập đến chuỗi hoặc là dòng bạn có ý định nói ?? Nếu nó là chuỗi .. sau đó đọc dòng đầu tiên và tokenize nó bằng cách sử dụng mô-đun chuỗi của erlang .... hoặc sử dụng các hoạt động bit phong cách lập trình chức năng cổ điển :) – Arunmu

+0

Điều này đọc thuật ngữ, không dây :-) "Đọc một thuật ngữ' hạn 'từ đầu vào chuẩn (' IoDevice'), nhắc nó bằng 'Nhắc'." –

+0

@Yasir: ohhk..thanks vì đã thông báo cho tôi .. tôi đã chỉnh sửa mã của mình .. – Arunmu

2

Một giải pháp khác, n_times thể được sử dụng ở những nơi khác:

-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]). 
Các vấn đề liên quan