2017-04-19 10 views
-1

私は2つの異なるファイルを持っています。最初のファイルは次のようになります。Erlangの2つのファイルを比較します

2番目のファイルには、さよなら2番目のファイルの名前(例えばmsg-0002)から、私はこのメッセージが最初のファイルで2番目でなければならないことを知っています。 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

あなたは 'のような意味リスト:nth(2、L1)==リスト:nth(1、L2) '? (L1の2番目の要素がL2の最初の要素と等しいかどうか確認してください) – Dogbert

+0

私は質問に従うことができません。リストと 'compare'関数から期待した結果の両方を提供するべきです。 –

答えて

2

(ファイル名を想定し、常にフォーム「MSG-XXX.file」のとおりです。

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

'リスト:nth(1、L2)'は 'hd(L2)'と言っても過言ではありません。 –

+0

以上:o) – Pascal

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). 
関連する問題