Erlang - поиск определенной строки во внешнем файле и добавление файла, если он отсутствует

Я хочу проверить, присутствует ли определенная строка во внешнем файле, прочитав файл построчно с помощью erlang. Если конкретная строка отсутствует, я хочу добавить файл со строкой. До сих пор мне удалось открыть файл и прочитать содержимое файла построчно. но я понятия не имею, как поступить с остальными. Я новичок в 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]).



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

привет мир:старт(). {хорошо,‹‹привет\r\nпривет››} хорошо

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

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


person Vinuri Mithara    schedule 30.01.2020    source источник


Ответы (1)


Если вам нужно попытаться найти определенный текст в файле, вы можете попробовать использовать 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.
person Viacheslav    schedule 30.01.2020
comment
Спасибо большое за вашу помощь!! Фрагмент кода был действительно полезен. - person Vinuri Mithara; 30.01.2020
comment
Можем ли мы определить макрос внутри функции? Что-то вроде кода, приведенного ниже? - person Vinuri Mithara; 31.01.2020
comment
модуль (привет мир). -экспорт([создатьпеременные/2,начало/0]). createVariables(ProjectName,UserName)-> -define(PROJECT_NAME,ProjectName), -define(USER_NAME,UserName). start() -> createVariables(dev_test_007, abcd), ``` - person Vinuri Mithara; 31.01.2020
comment
Вы можете определять макросы в любом месте модуля, но хорошим стилем кода является создание макросов в заголовочном файле или в заголовке модуля. - person Viacheslav; 31.01.2020