прочитать файл определенного содержания в erlang - PullRequest
0 голосов
/ 23 июня 2018

Я следовал этому методу для чтения файлов - как читать содержимое файла в Erlang?

Упомянутый ответ работает хорошо. Тем не менее, мой файл выглядит так:

{0, {data, node, 0}}
{1, {someData, node, 1}}

Каждая строка будет иметь эти данные. Таким образом, при чтении файла я хочу отфильтровать, сколько строк он должен прочитать как то так:

read(Node, FirstIndex, LastIndex, F, Acc)

Здесь F - это функция сгиба, которая берет одну запись в журнале и текущий аккумулятор и возвращает новое значение аккумулятора.

Как мне включить решение с той функцией, которая мне нужна ??

1 Ответ

0 голосов
/ 23 июня 2018
-module(my).
-compile(export_all).

get_section(Start, End, Fname) when Start>0, End>=Start ->
    {ok, Io} = file:open(Fname, read),
    ok = advance_file_pointer(Start, Io),
    Lines = getNLines(End-Start+1, Io),
    file:close(Io),
    Lines.

advance_file_pointer(1, _Io) ->
    ok;
advance_file_pointer(Start, Io) ->
    {ok, _Line} = file:read_line(Io),
    advance_file_pointer(Start-1, Io).

getNLines(N, Io) ->
    getNLines(N, Io, []).

getNLines(0, _Io, Acc) ->
    lists:reverse(Acc);
getNLines(N, Io, Acc) ->
    {ok, Line} = file:read_line(Io),
    getNLines(N-1, Io, [Line|Acc]).

В оболочке:

~/erlang_programs$ cat data.txt
{1, {data, node, 1}}
{2, {someData, node, 2}}
{3, {otherData, node, 3}}

~/erlang_programs$ erl
Erlang/OTP 20 [erts-9.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V9.2  (abort with ^G)
1> c(my).
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}

2> my:get_section(1, 1, "data.txt").
["{1, {data, node, 1}}\n"]

3> my:get_section(1, 2, "data.txt").
["{1, {data, node, 1}}\n","{2, {someData, node, 2}}\n"]

4> my:get_section(1, 3, "data.txt").
["{1, {data, node, 1}}\n","{2, {someData, node, 2}}\n",
 "{3, {otherData, node, 3}}\n"]

5> my:get_section(2, 3, "data.txt").
["{2, {someData, node, 2}}\n","{3, {otherData, node, 3}}\n"]
6> my:get_section(2, 2, "data.txt").
["{2, {someData, node, 2}}\n"]

7> my:get_section(0, 2, "data.txt").
** exception error: no function clause matching my:get_section(0,2,"data.txt") (my.erl, line 4)

8> my:get_section(1, 4, "data.txt").
** exception error: no match of right hand side value eof
     in function  my:getNLines/3 (my.erl, line 20)
     in call from my:get_section/3 (my.erl, line 7)

9> 

Вы можете применить свою функцию сгиба во втором пункте getNLines/3.

...