我有两个不同的文件。第一个文件看起来像:
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).