比较Erlang中的两个文件

时间:2017-04-19 17:39:54

标签: file erlang compare

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

hallo
bye
something
new

在第二个文件中我有例如。再见。从第二个文件的名称(例如,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 个答案:

答案 0 :(得分:1)

从文件名中提取行号(假设文件名的格式始终为&#34; msg-XXX.file&#34;:

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

然后检查2个文件是否一致,使用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),
...

答案 1 :(得分:0)

有很多方法可以做到,例如在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("Yes\n"),
                    halt(0);
                false ->
                    Quiet orelse io:put_chars("No\n"),
                    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).