Erlang - 在外部文件中搜索特定字符串,如果不存在则追加文件

Erlang - search for a specific string within an external file and append file if not present

我想通过使用 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]).



我得到的结果是:

helloworld:开始()。 {好的,<<"hello\r\nhi">>} 好的

我正在使用的示例文件: 文件名:“file.txt”

文件内容: 你好 嗨

如果您需要尝试在文件中查找特定文本,您可以尝试使用 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.