首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Erlang从文件中读取前5行

Erlang从文件中读取前5行
EN

Stack Overflow用户
提问于 2011-02-05 13:02:36
回答 2查看 3.1K关注 0票数 6

例如,我有一个包含10个文本字符串的txt文件。如何使用erlang读取此文本的前5个字符串?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-05 14:07:55

您可能需要启用缓冲的file:open/2file:read_line/1的组合。

一首押韵诗:

代码语言:javascript
复制
$ 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.

源文件:

代码语言:javascript
复制
$ 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.

传递给file:open/2Modes中的raw允许更快地访问文件,因为不需要任何Erlang进程来处理文件。

示例运行:

代码语言:javascript
复制
$ 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

代码语言:javascript
复制
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>
票数 8
EN

Stack Overflow用户

发布于 2011-02-09 02:01:55

另一种解决方案,n_times可以在其他地方使用:

代码语言:javascript
复制
-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]).
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4905247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档