File Erlang文件差异

File Erlang文件差异,file,erlang,diff,File,Erlang,Diff,我需要得到2个文件的差异。例如: File 1: asd qwe File 2: asd qwe zxc 我需要代码中的行zxc。如何使用erlang?我将通过以下方式处理此问题: -module(main). -export([main/0]). read_all(F) -> R = file:read_line(F), read_all(F, R, []). read_all(F, {ok, Data}, A) -> R = file:re

我需要得到2个文件的差异。例如:

File 1:
asd
qwe

File 2:
asd
qwe
zxc

我需要代码中的行
zxc
。如何使用erlang?

我将通过以下方式处理此问题:

-module(main).

-export([main/0]).    

read_all(F) ->
    R = file:read_line(F),
    read_all(F, R, []).
read_all(F, {ok, Data}, A) ->
    R = file:read_line(F), 
    read_all(F, R, A ++ [Data]);
read_all(_, eof, A) ->
    A.

main() ->
    {ok, F1} = file:open("file1", [raw, read_ahead]),
    F1Data = read_all(F1),
    {ok, F2} = file:open("file2", [raw, read_ahead]),
    F2Data = read_all(F2),   
    S1 = sets:from_list(F1Data),
    S2 = sets:from_list(F2Data),
    io:format("~p ~p~n", [S1, S2]),
    sets:subtract(S2, S1).
您可能需要以更易于阅读的格式显示set操作的结果(
sets:subtract,在本例中为
),从而对其进行润色。

这样如何

1> {ok,Bin}=file:read_file("1.txt").
{ok,<<"asd\nqwe\n">>}
2> {ok,Bin2}=file:read_file("2.txt").
{ok,<<"asd\nqwe\nzxc\n">>}
3> L1=binary:split(Bin, <<"\n">>, [global]).   
[<<"asd">>,<<"qwe">>,<<>>]
4> L2=binary:split(Bin2, <<"\n">>, [global]).
[<<"asd">>,<<"qwe">>,<<"zxc">>,<<>>]
5> L2 -- L1.    
[<<"zxc">>]
1>{ok,Bin}=file:read_file(“1.txt”)。
{好的,}
2> {ok,Bin2}=file:read_file(“2.txt”)。
{好的,}
3> L1=二进制:拆分(Bin,[全局])。
[,,]
4> L2=二进制:拆分(Bin2,[全局])。
[,,,]
5> L2--L1。
[]

但是如果你想要第一个文件中的其他差异,你也必须做L1--L2。

文件是按行排序的吗?这是一个文件,但随着时间的推移,它可能会改变(添加行)。你可能想计算每个文件的MD5,如果输出相同,那么不用费心去寻找差异。但是文件在主要情况下是不同的!