file - Erlang 从文件中读取前 5 行

标签 file file-io erlang

例如,我有一个包含 10 个文本字符串的 txt 文件。如何使用 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>

关于file - Erlang 从文件中读取前 5 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4905247/

相关文章:

java - 使用camel写入文件并设置chmod

javascript - 如何获取在 JavaScript 中上传的文件的修改时间?

c - 读取文件时无法检查换行符

node.js - 如何使用node.js在两台计算机之间共享本地文件?

java - 读取文件并求平均值,不断要求用户输入

python - 如何在Python中将一个csv文件中的状态代码映射到另一个csv文件中的状态名称?

concurrency - 在erlang中测量并发循环时间

erlang - 如何停止第三方 Erlang 应用程序

c - fopen() 中 r+ 模式的问题

mysql - 使用 MySQL 和 ejabberd 进行高效的外部排类