0

erlangでriakのマップフェーズを作成しようとしていますが、問題が発生しました。説明とコードを連結する必要があります。これらは別々のアイテムであり、「code-description」の形式で結合します。次に、値1を指定する必要があるため、「code-description」= 1で、私のreduceフェーズでも同じことが起こります(説明は静的プールからのものであり、フリーテキストではありません)。ダッシュも重要です。プロップリストを使用して、必要な値に移動できます。{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 に答える