比较Erlang中的两个文件



我有两个不同的文件。第一个文件看起来像:

hallo
bye
something
new

,在第二个文件中,我有EG。再见。从第二文件的名称(例如MSG-0002(,我知道此消息必须在第一个文件中排名第二。在Erlang中,我该如何在第一个文件中找到该单词?我只需要看看第二个单词是否真的是再见。

那是我到目前为止制作的代码:

-module(compare).
-export([compare/0]).
compare () ->
    {ok, Pars} = file:read_file("words.txt"),
    {ok, Dump} = file:read_file("msg-0002.file"), 
    L1 = binary:split(Pars, <<"n">>, [global]).
    L2 = binary:split(Dump, <<"n">>, [global]).

在此代码中,我在列表中获取所有单词。我不知道该如何从MSG-0002文件的名称中获取,该单词必须在2中。放在第一个文件中。以及如何检查这个特别的单词是否真的在EG中。第一个文件中的第二名?这很重要。

从文件名提取行号(假设文件名称始终为" msg-xxx.file":

FileName = "msg-0002.file",
{ok,[NumLine],_} = io_lib:fread("msg-~d.file",FileName),

然后检查两个文件是否一致,请使用Dogbert建议:

{ok, Pars} = file:read_file("words.txt"),
{ok, Dump} = file:read_file(FileName),
L1 = binary:split(Pars, <<"n">>, [global]),
L2 = binary:split(Dump, <<"n">>, [global]),
Check = lists:nth(NumLine, L1) == lists:nth(1, L2),
...

有多种方法可以做到这一点,例如在escript中:

#!/usr/bin/env escript
main(["-q"|ARGS]) ->
    compare(ARGS, true);
main(ARGS) ->
    compare(ARGS, false).
compare([MsgFile, WordsFile], Quiet) ->
    case io_lib:fread("msg-~d", MsgFile) of
        {ok, [N], _} when N > 0 ->
            Msg  = read_msg(MsgFile),
            Word = read_nth(WordsFile, N),
            case Msg =:= Word of
                true ->
                    Quiet orelse io:put_chars("Yesn"),
                    halt(0);
                false ->
                    Quiet orelse io:put_chars("Non"),
                    halt(1)
            end;
        _ -> usage()
    end;
compare(_, _) ->
    usage().
read_msg(File) ->
    {ok, FH} = file:open(File, [read, binary]),
    {ok, Msg} = file:read_line(FH),
    ok = file:close(FH),
    Msg.
read_nth(File, N) ->
    {ok, FH} = file:open(File, [raw, read, binary, read_ahead]),
    Word = read_nth_(FH, N),
    ok = file:close(FH),
    Word.
read_nth_(FH, N) ->
    case file:read_line(FH) of
        {ok, Word} when N =:= 1 -> Word;
        {ok, _} -> read_nth_(FH, N-1);
        Error -> error({words_file, Error})
    end.
usage() ->
    io:format(standard_error, "~ts [-q] <msg-file> <words-file>~n"
              "t<msg-file> - must have name in form msg-N*~n",
              [escript:script_name()]),
    halt(255).

相关内容

  • 没有找到相关文章

最新更新