0

我正在尝试用 erlang 为 riak 编写地图阶段,但遇到了问题。我需要连接描述和代码,它们是单独的项目,并以“代码描述”的形式将它们组合起来,然后需要将其赋值为 1,因此“代码描述”=1 以便我计算在我的减少阶段也出现了同样的情况(描述来自静态池,而不是自由文本)。破折号也很重要。使用 proplists 我可以导航到我想要的值并使用 {struct, values} = ...etc 我得到了一些类似的东西:

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

当我编写以下代码段时,我只得到过滤列表中每个 kv 的 desc 返回:

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

看到它们都是字符数据,我认为[DescVar ++ CodeVar]。会工作,但是当我对我的集群运行它时,我实际上收到了一条错误消息,它抱怨 ++。+ 也不起作用,所以我该如何在 erlang 中做我所追求的?

4

2 回答 2

1

我认为您的输入示例在 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> 
于 2012-12-15T17:44:57.363 回答
1

我没有玩过 Riak,但我假设您正在使用典型的 erlang 解码 json([{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].

“数据”是 erlang 解码的 JSON。

这会产生:

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

将 JSON 字符串编码为:

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

于 2012-12-15T22:43:17.593 回答