2011-02-05 22 views
6

Ad esempio, ho un file txt con 10 stringhe di testo. Come posso leggere la prima stringa di questo testo con erlang?Erlang legge dal file le prime 5 righe

Grazie.

+0

@OP : Sei pregato di accettare una risposta, se una delle risposte pubblicate risponde alla tua domanda e sei soddisfatto wi questo – Arunmu

+0

@ArunMu: un utente vedrà il commento, aggiunto al suo post, anche se non ci sono '@' davanti al nick. ;-) –

risposta

8

Probabilmente si desidera una combinazione di file:open/2 e file:read_line/1 con buffer abilitato.

una rima:

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

File di origine:

$ 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, in Modes, passato al file:open/2, consente un accesso più rapido a un file, in quanto non è necessario alcun processo di Erlang per gestire il file.

esempio di esecuzione:

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

Per rimuovere nuova riga da una stringa, è possibile utilizzare 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

utilizzare il modulo io di erlang.

io: leggi (FD, '').

Dove FD è il Gestore file.

Si prega inoltre di cercare il documento di erlang per la sintassi corretta.

Ecco un codice di massima

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

È possibile utilizzare un contatore se si desidera elaborare solo 10 linee

+0

Vedo che hai citato la stringa o sono le righe che hai intenzione di dire ?? Se è una stringa ... allora leggi la prima riga e falla leggere usando il modulo stringa di erlang .... o usa le operazioni bit classico stile di programmazione funzionale :) – Arunmu

+0

Questo legge i termini, non le stringhe :-) "Legge un termine' Termine 'dallo standard input (' IoDevice'), chiedendolo con 'Prompt'." –

+0

@Yasir: ohhk..grazie per avermi fatto notare che ... ho modificato il mio codice .. – Arunmu

2

Un'altra soluzione, n_times possono essere usati altrove:

-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]). 
Problemi correlati