Erlang - поиск указанной строки c во внешнем файле и добавление файла, если его нет - PullRequest
2 голосов
/ 30 января 2020

Я хочу проверить, присутствует ли указанная строка c во внешнем файле, читая файл построчно, используя erlang. Если заданная строка c отсутствует, я sh добавлю файл со строкой. До сих пор мне удалось открыть файл и прочитать содержимое файла построчно. но я понятия не имею, как поступить с остальными. Я новичок в Erlang, поэтому любая помощь по этому вопросу будет высоко оценена.

Что я пробовал до сих пор:

-module(helloworld). 
-export([readlines/1,get_all_lines/1,start/0]). 

readlines(FileName) ->
    {ok, Device} = file:open(FileName, [read]),
    try get_all_lines(Device)
      after file:close(Device)
    end.

get_all_lines(Device) ->
    case io:get_line(Device, "") of
        eof  -> [];
        Line -> Line ++ get_all_lines(Device)
    end.



start() ->


readlines("D:\\documents\\file.txt"),
Txt=file:read_file("D:\\documents\\file.txt"),
io:fwrite("~p~n", [Txt]).



Что я получил в результате:

helloworld: start (). {ok, << "hello \ r \ nhi" >>} ok

Пример файла, который я использую: имя файла: "file.txt"

содержимое файла: привет привет

1 Ответ

1 голос
/ 30 января 2020

Если вам нужно попытаться найти указанный c текст в файле, вы можете попробовать использовать функцию re: run / 2 . Вот пример, как вы можете попытаться найти specific string в файле, и если вы не найдете эту строку - строка будет записана в log.txt файле:

-module(helloworld).
-export([start/0]).

-define(LOG_FILE, "log.txt").

start() ->
  read_data("file.txt").

read_data(FileName) ->
  case file:read_file(FileName) of
    {error, enoent} ->
      io:format("File ~p not found~n", [FileName]);
    {ok, Data} ->
      find_text(Data)
  end.

find_text(Data) ->
  Text = <<"specific string">>,
  case re:run(Data, Text) of
    nomatch ->
      write_log(Text);
    _ ->
      ok
  end.

write_log(Text) ->
  case file:read_file(?LOG_FILE) of
    {ok, Data} when Data =/= <<>> ->
      file:write_file(?LOG_FILE, <<Data/binary, "\n", Text/binary>>);
    _ ->
      file:write_file(?LOG_FILE, Text)
  end.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...