Объединение значений, содержащихся в кортежах, в erlang

Я пытаюсь написать фазу карты для riak в erlang и столкнулся с проблемой. Мне нужно объединить описание и код, которые являются отдельными элементами, и объединить их в форме «код-описание», которому затем нужно присвоить значение 1, поэтому «код-описание» = 1, чтобы я мог подсчитать количество такие же случаи на моей фазе сокращения (описания взяты из статического пула, а не из свободного текста). Штрих тоже важен. Используя proplists, я могу перейти к нужным значениям, а с помощью {struct, values} = ...etc я получаю что-то вроде строк:

[{"desc":"Stuff Needs Doing","code":"SND"},{"desc":"Done","code":"DNE"}]

Когда я пишу следующий фрагмент, я получаю только desc, возвращаемый для каждого kv в моем отфильтрованном списке:

Desc = proplists:get_value(<<"desc">>, Data),
[Desc].

Увидев, что они оба являются символьными данными, я подумал, что [DescVar ++ CodeVar]. будет работать, но когда я запустил его в своем кластере, я получил сообщение об ошибке, и он жалуется на ++. + тоже не работает, так как мне сделать то, что мне нужно, в erlang?


person Nickel    schedule 11.12.2012    source источник
comment
я бы хотел, чтобы вы могли просто указать, как вы хотите, чтобы ваш окончательный результат выглядел из ввода, который у вас есть выше   -  person Muzaaya Joshua    schedule 12.12.2012
comment
Результат, который я хочу, это [{'SND-Stuff Needs Doing':1, 'DNE-Done':1}]. Извини за это! Я не уверен, что это правильный Erlang, который вы видите, но я пытаюсь написать Erlang-эквивалент запроса js mapreduce.   -  person Nickel    schedule 12.12.2012


Ответы (2)


Я не играл с Riak, но предполагаю, что вы работаете с типичным декодированным json erlang (в формате [{struct,Values}]).

[{"desc":"Stuff Needs Doing","code":"SND"},{"desc":"Done","code":"DNE"}]

Приведенная выше строка json будет декодирована в erlang как:

[{struct,[{<<"desc">>,<<"Stuff Needs Doing">>},
      {<<"code">>,<<"SND">>}]},
{struct,[{<<"desc">>,<<"Done">>},{<<"code">>,<<"DNE">>}]}]

Тогда это понимание списка даст вам результаты, которые вы ищете (и сохраните правильный формат результата):

[{struct,[{<<X/binary,"-",Y/binary>>,1}]}||{struct,[{<<"desc">>,Y},{<<"code">>,X}]}<-Data].

«Данные» — это JSON, декодированный с помощью erlang.

Это производит:

[{struct,[{<<"SND-Stuff Needs Doing">>,1}]},{struct,[{<<"DNE-Done">>,1}]}]

Который кодирует строку JSON как:

[{"SND-Stuff Needs Doing":1},{"DNE-Done":1}]

person daedae    schedule 15.12.2012

Я не думаю, что ваш пример ввода действителен в Erlang.

Тем не менее, например, если ваш ввод будет таким:

[{"desc","A","code","B"}, {"desc","A","code","B"}, {"desc","C","code","B"}]

Тогда это действительно хочет, чтобы вы хотели:

test() ->
    do([{"desc","Stuff Needs Doing","code","SND"},{"desc","Done","code","DNE"},{"desc","Done","code","DNE"}]).

do(L) -> 
    L2 = lists:map(fun({_,D,_,C}) -> C++"-"++D end, L),
    count(L2,[]).

count([], Acc) -> Acc;
count([H|T], Acc) -> 
    case lists:keytake(H,1,Acc) of
        false -> count(T, [{H,1} | Acc]);
        {value, {H,N}, Acc2} -> count(T, [{H,N+1} | Acc2])
    end.

Вывод:

1> test:test().
[{"DNE-Done",2},{"SND-Stuff Needs Doing",1}]
2> 
person ricardobcl    schedule 15.12.2012