内部列表Erlang的自定义连接

内部列表Erlang的自定义连接,erlang,concatenation,Erlang,Concatenation,我有一个很大的表单列表,其中包含需要与其他同名表单中的其他数据关联的数据 列表格式非常复杂,如下所示: [[{EVAL_SEQ_1, {FORMNAME, ListDataToConcat1}}], [{EVAL_SEQ_2, {FORMNAME, ListDataToConcat2}}], ...] [{"eval_data_11", {<<"prvl_mobable_asset_0000_h200401">>, [{'F_01_0100',[

我有一个很大的表单列表,其中包含需要与其他同名表单中的其他数据关联的数据

列表格式非常复杂,如下所示:

[[{EVAL_SEQ_1, {FORMNAME, ListDataToConcat1}}], [{EVAL_SEQ_2, {FORMNAME, ListDataToConcat2}}], ...]
[{"eval_data_11",
   {<<"prvl_mobable_asset_0000_h200401">>,
         [{'F_01_0100',[[], [1]]},
          {'F_01_0090',[["2"], ["3"]]},
          {'F_01_0080',[[], []]},
          {'F_01_0070',[[22222], [9999]]},
          {'F_01_0060',[[{era,0},{year,[]},{month,[]}], [{era,0},{year,[]},{month,[]}]]},
          {'F_01_0050',[[], []]},
          {'F_01_0040',[[], []]},
          {'F_01_0030',[[], []]},
          {'F_01_0020',[[<<>>], [<<>>]]},
          {'F_01_0010',[[<<"4 - 1">>], [<<"4 - 8">>]}]}}]
这是我想要的输出:

[{EVAL_SEQ_1,{FORMNAME,ListDataToConcat1+ListDataToConcat2}}}}]}]…]

其中:

EVAL_SEQ_1 = Form Sequence Number,
FORMNAME = Form Name
ListDataToConcat = List that Needs to concat
这是我的样本数据:

[[{"eval_data_12",
    {<<"prvl_mobable_asset_0000_h200401">>,
     [{'F_01_0100',[1]},
      {'F_01_0090',["3"]},
      {'F_01_0080',[]},
      {'F_01_0070',[9999]},
      {'F_01_0060',[{era,0},{year,[]},{month,[]}]},
      {'F_01_0050',[]},
      {'F_01_0040',[]},
      {'F_01_0030',[]},
      {'F_01_0020',<<>>},
      {'F_01_0010',<<"4 - 8">>}]}}],
  [{"eval_data_11",
    {<<"prvl_mobable_asset_0000_h200401">>,
     [{'F_01_0100',[]},
      {'F_01_0090',["2"]},
      {'F_01_0080',[]},
      {'F_01_0070',[22222]},
      {'F_01_0060',[{era,0},{year,[]},{month,[]}]},
      {'F_01_0050',[]},
      {'F_01_0040',[]},
      {'F_01_0030',[]},
      {'F_01_0020',<<>>},
      {'F_01_0010',<<"4 - 1">>}]}}], ...]
[{“eval_data_12”,
{,
[{'F_01_0100',[1]},
{'F_01_0090',[“3”]},
{'F_01_0080',[]},
{'F_01_0070',[9999]},
{'F_01_0060',[{era,0},{year,[]},{month,[]}},
{'F_01_0050',[]},
{'F_01_0040',[]},
{'F_01_0030',[]},
{'F_01_0020',},
{'F_01_0010',}]}},
[{“评估数据11”,
{,
[{'F_01_0100',[]},
{'F_01_0090',[“2”]},
{'F_01_0080',[]},
{'F_01_0070',[22222]},
{'F_01_0060',[{era,0},{year,[]},{month,[]}},
{'F_01_0050',[]},
{'F_01_0040',[]},
{'F_01_0030',[]},
{'F_01_0020',},
{'F_01_0010',}]}},…]
我想要这样的结果输出:

[[{EVAL_SEQ_1, {FORMNAME, ListDataToConcat1}}], [{EVAL_SEQ_2, {FORMNAME, ListDataToConcat2}}], ...]
[{"eval_data_11",
   {<<"prvl_mobable_asset_0000_h200401">>,
         [{'F_01_0100',[[], [1]]},
          {'F_01_0090',[["2"], ["3"]]},
          {'F_01_0080',[[], []]},
          {'F_01_0070',[[22222], [9999]]},
          {'F_01_0060',[[{era,0},{year,[]},{month,[]}], [{era,0},{year,[]},{month,[]}]]},
          {'F_01_0050',[[], []]},
          {'F_01_0040',[[], []]},
          {'F_01_0030',[[], []]},
          {'F_01_0020',[[<<>>], [<<>>]]},
          {'F_01_0010',[[<<"4 - 1">>], [<<"4 - 8">>]}]}}]
[{“评估数据11”,
{,
[{'F_01_0100',[[],[1]},
{'F_01_0090',[[“2”],[“3”]},
{'F_01_0080',[[],[]]},
{'F_01_0070',[22222],[9999]},
{'F_01_0060',[[{era,0},{year,[]},{month,[]},{era,0},{year,[]},{month,[]},
{'F_01_0050',[[],[]]},
{'F_01_0040',[[],[]]},
{'F_01_0030',[[],[]]},
{'F_01_0020',[[],[]]},
{'F_01_0010',[[],[]}]}]
@trex:

FormList = [[{EVAL_SEQ_1, {FORMNAME, ListDataToConcat1}}], [{EVAL_SEQ_2, {FORMNAME, ListDataToConcat2}}], ....]
您需要从列表中获得一个单独的列表,该列表具有常见的表单名称,如

因此,您将获得新的元组,如下所示:

{[EVAL_SEQ_1, EVAL_SEQ_2, EVAL_SEQ_3, ...], [ListDataToConcat1, ListDataToConcat2, ListDataToConcat3,...]}
我不确定你想要哪个序列号,因为你没有清楚地提到,这里是你可以得到最小序列号的方法。 Evalsequence=列表:最小值(EvalSeq)

现在使用如下所示的
merge
功能合并您的代码,或者您可以参考:

最后是一个单独的列表,如下所示:

[{Evalsequence, {<<"prvl_mobable_asset_0000_h200401">>, MergedList}}].


merge(ListOfLists) ->
        Combined = lists:append(ListOfLists),
        Fun      = fun(Key) -> {Key,proplists:get_all_values(Key,Combined)} end,
        lists:map(Fun,proplists:get_keys(Combined)).
[{Evalsequence,{,MergedList}]。
合并(列表)->
组合=列表:追加(列表列表),
Fun=Fun(Key)->{Key,proplist:get_all_value(Key,Combined)}end,
列表:地图(乐趣,道具列表:获取_键(组合))。

我向您推荐以下解决方案:

[编辑]

我修改了代码以回答您的最后一条评论,但仍然有一些模糊的东西:

  • 如果资产不同,是否创建不同的记录列表
  • 如果没有,资产名称该怎么办?我选择保留“最小的一个”
  • 记录的顺序重要吗?我决定不重要
一句话,我遗漏了一些上下文,但如果我添加以收集这些信息,我会将其存储在ets表中。它更新更快,易于遍历,并且在需要时易于转换为列表

-module (t).

-compile([export_all]).

%      rec = {atom,term}
%      reclist = [rec,...]
%      asset = {bin,reclist}
%      eval_data = [{list,asset}]
%      eval_set = [eval_data,...]
%      recs = {atom,[term]}
%      recslist = [recs,...]

addrec({Key,Val},Recslist) ->
    Val_list = proplists:get_value(Key, Recslist, []),
    [{Key,[Val|Val_list]}|proplists:delete(Key,Recslist)].

merge_rec(Reclist,Recslist) -> lists:foldl(fun(Rec,Acc) -> addrec(Rec,Acc) end,Recslist,Reclist).


merge_eval([{Eval,{Asset,Reclist}}],[]) ->
    [{Eval,{Asset,[{Key,[Val]} || {Key,Val} <- Reclist]}}];
merge_eval([{Eval,{Asset,Reclist}}],[{Eval_low,{Asset_low,Recslist}}]) ->
    [{min(Eval,Eval_low),{min(Asset,Asset_low),merge_rec(Reclist,Recslist)}}].

merge_set(Eval_set) -> lists:foldl(fun(Eval_data,Acc) -> merge_eval(Eval_data,Acc) end,[],Eval_set).

test() ->
    Eval_set =  [[{"eval_data_10",
                {<<"prvl_mobable_asset_0000_h200401">>,
                 [{'F_01_0100',[1]},
                  {'F_01_0090',["3"]},
                  {'F_01_0080',[]},
                  {'F_01_0070',[9999]},
                  {'F_01_0060',[{era,0},{year,[]},{month,[]}]},
                  {'F_01_0050',[]},
                  {'F_01_0040',[]},
                  {'F_01_0030',[]},
                  {'F_01_0020',<<>>},
                  {'F_01_0010',<<"4 - 8">>}]}}],
              [{"eval_data_11",
                {<<"prvl_mobable_asset_0000_h200401">>,
                 [{'F_01_0100',[]},
                  {'F_01_0090',["2"]},
                  {'F_01_0080',[]},
                  {'F_01_0070',[22222]},
                  {'F_01_0060',[{era,0},{year,[]},{month,[]}]},
                  {'F_01_0050',[]},
                  {'F_01_0040',[]},
                  {'F_01_0030',[]},
                  {'F_01_0020',<<>>},
                  {'F_01_0010',<<"4 - 1">>}]}}]],
    merge_set(Eval_set).
-模块(t)。
-编译([export_all])。
%rec={atom,term}
%重新列表=[rec,…]
%资产={bin,reclist}
%eval_data=[{列表,资产}]
%eval_集=[eval_数据,…]
%recs={atom,[term]}
%recslist=[recs,…]
addrec({Key,Val},Recslist)->
Val_list=proplists:get_值(Key,Recslist,[]),
[{Key[Val | Val|u list]}| proplist:delete(Key,Recslist)]。
merge_rec(Reclist,Recslist)->列表:foldl(fun(rec,Acc)->addrec(rec,Acc)end,Recslist,Reclist)。
合并评估([{eval,{Asset,Reclist}}],])->
[{Eval,{Asset,[{Key,[Val]}{Key,Val}
[{min(Eval,Eval_low),{min(Asset,Asset_low),merge_rec(Reclist,Recslist)}]。
合并评估集(评估集)->列表:foldl(乐趣(评估数据,Acc)->合并评估集(评估数据,Acc)结束,[],评估集)。
测试()->
Eval_set=[{“Eval_数据_10”,
{,
[{'F_01_0100',[1]},
{'F_01_0090',[“3”]},
{'F_01_0080',[]},
{'F_01_0070',[9999]},
{'F_01_0060',[{era,0},{year,[]},{month,[]}},
{'F_01_0050',[]},
{'F_01_0040',[]},
{'F_01_0030',[]},
{'F_01_0020',},
{'F_01_0010',}]}},
[{“评估数据11”,
{,
[{'F_01_0100',[]},
{'F_01_0090',[“2”]},
{'F_01_0080',[]},
{'F_01_0070',[22222]},
{'F_01_0060',[{era,0},{year,[]},{month,[]}},
{'F_01_0050',[]},
{'F_01_0040',[]},
{'F_01_0030',[]},
{'F_01_0020',},
{'F_01_0010',}]}}],,
合并集合(评估集合)。

您的预期结果有一些不一致性
{'F_01_0090'、[[“2”]、[“3”]}与{'F_01_0010'、[[]、]}
不同,您还应该澄清您是否想要重复的结果,如
{'F_01_0050'、[[]、[]]}
,而不是
{'F_01_0050'、[[]]
,如果您想将所有结果合并到一个资产中,即使它们出现在一个资产中,或者如果每个资产中的键列表总是相同的话。@Pascal:对不起,那是我的错误。请现在检查,它已被更正。您的代码非常漂亮。谢谢您的解决方案,我有一个问题,我想要一个最低的评估表编号I.e.Result应该与“eval_data_11”一起出现。这种情况发生在上述情况下。但当我在项目中使用此代码时,我没有得到最低的eval表单编号。因为客户端级别的javascript抛出错误。请参阅答案中的修改版本
-module (t).

-compile([export_all]).

%      rec = {atom,term}
%      reclist = [rec,...]
%      asset = {bin,reclist}
%      eval_data = [{list,asset}]
%      eval_set = [eval_data,...]
%      recs = {atom,[term]}
%      recslist = [recs,...]

addrec({Key,Val},Recslist) ->
    Val_list = proplists:get_value(Key, Recslist, []),
    [{Key,[Val|Val_list]}|proplists:delete(Key,Recslist)].

merge_rec(Reclist,Recslist) -> lists:foldl(fun(Rec,Acc) -> addrec(Rec,Acc) end,Recslist,Reclist).


merge_eval([{Eval,{Asset,Reclist}}],[]) ->
    [{Eval,{Asset,[{Key,[Val]} || {Key,Val} <- Reclist]}}];
merge_eval([{Eval,{Asset,Reclist}}],[{Eval_low,{Asset_low,Recslist}}]) ->
    [{min(Eval,Eval_low),{min(Asset,Asset_low),merge_rec(Reclist,Recslist)}}].

merge_set(Eval_set) -> lists:foldl(fun(Eval_data,Acc) -> merge_eval(Eval_data,Acc) end,[],Eval_set).

test() ->
    Eval_set =  [[{"eval_data_10",
                {<<"prvl_mobable_asset_0000_h200401">>,
                 [{'F_01_0100',[1]},
                  {'F_01_0090',["3"]},
                  {'F_01_0080',[]},
                  {'F_01_0070',[9999]},
                  {'F_01_0060',[{era,0},{year,[]},{month,[]}]},
                  {'F_01_0050',[]},
                  {'F_01_0040',[]},
                  {'F_01_0030',[]},
                  {'F_01_0020',<<>>},
                  {'F_01_0010',<<"4 - 8">>}]}}],
              [{"eval_data_11",
                {<<"prvl_mobable_asset_0000_h200401">>,
                 [{'F_01_0100',[]},
                  {'F_01_0090',["2"]},
                  {'F_01_0080',[]},
                  {'F_01_0070',[22222]},
                  {'F_01_0060',[{era,0},{year,[]},{month,[]}]},
                  {'F_01_0050',[]},
                  {'F_01_0040',[]},
                  {'F_01_0030',[]},
                  {'F_01_0020',<<>>},
                  {'F_01_0010',<<"4 - 1">>}]}}]],
    merge_set(Eval_set).