我有两个不同的文件。第一个文件看起来像这样:
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文件的名称中获取该字必须位于第一个文件中的位置。以及如何检查这个特别的词是否真的在例如。第一档中的第二名?这很重要。
答案 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).