patagonia2 发表于 2016-04-19 10:25

求和?

有一个类似这样的大文件

a 11 23 34 22 34 56
b 23 46 32 64 67 34
c 64 67 34 11 23 34
a 12 33 35 22 39 36
b 21 41 12 61 62 24
c 25 17 14 21 22 14
...


文件的行和列都比较多,
想分类求和,结果如下:

a 23 56 69 44 73 92
b 44 87 44 125 129 58
c 89 84 48 33 45 48
......

请问怎么实现:emn18:
谢谢!

q1208c 发表于 2016-04-19 16:18

回复 1# patagonia2

没看懂你的求和算法 。。。
   

patagonia2 发表于 2016-04-19 20:32

回复 2# q1208c


a: 11 + 12 -> 23
23 + 33 -> 56

a 11 23 34 22 34 56
b 23 46 32 64 67 34
c 64 67 34 11 23 34
a 12 33 35 22 39 36


结果如下:

a 23 56 69 44 73 92
b 44 87 44 125 129 58
c 89 84 48 33 45 48
......

q1208c 发表于 2016-04-20 11:35

回复 3# patagonia2

如果你的文件不是太大,还好办。

如果文件太大了, 或者行太多了, 很可能内存不够。 需要使用临时文件了。

我已经2年多没写过 erlang 的代码了。 怕是都不记得怎么写了。
   

shijiang1130 发表于 2016-04-20 11:47

回复 4# q1208c 写一个,写一个,写一个{:yxh36:}


   

q1208c 发表于 2016-04-20 12:11

回复 5# shijiang1130

你来。:mrgreen:
   

shijiang1130 发表于 2016-04-20 12:54

回复 6# q1208c

想写来着,但不知道怎么匹配 “...”,不但要自己写,还要自己造数据,工程太麻烦
   

q1208c 发表于 2016-04-20 13:01

回复 7# shijiang1130
可以先用楼主的数据呀。

够用了。

   

shijiang1130 发表于 2016-04-20 17:55

-module(t).

-compile(export_all).

get_same_seq() ->
    {ok, F} = file:open("in.txt", ),
    all_line(F).

all_line(F) ->
    case io:get_line(F, "") of
      eof -> file:close(F);
      L ->
          Line = binary:replace(L, <<"\n">>, <<>>),
           = binary:split(Line, <<" ">>, ),
          case ets:lookup(sum, N) of
          [{N, Old}] ->
                New = ,
                %= Old,
                %io:format("Old: ~p ~p ~p ~p ~p ~p ~n",),
                Add = lists:zipwith(fun (C1, C2) ->
                                          list_to_integer(C1) +
                                              list_to_integer(C2)
                                  end,
                                  New, Old),
                Add1 = ,
                ets:insert(sum, {N, Add1});
          [] ->
                Init = ,
                ets:insert(sum, {N, Init})
          end,
          all_line(F)
    end.

all_line_1(A1) -> binary_to_list(A1).

all_line_2(_T) -> integer_to_list(_T).

all_line_3(A1) -> binary_to_list(A1).

p() ->
    case H of
      {N, } ->
          io:format("~p: ~p ~p ~p ~p ~p ~p ~n",
                  );
      {<<>>, []} -> skip
    end,
    p(T);
p([]) -> done.

main() ->
    ets:new(sum,
          ),
    get_same_seq(),
    Result = ets:tab2list(sum),
    p(Result).

shijiang1130 发表于 2016-04-20 17:56

100> t:main().
<<"b">>: "396" "783" "396" "1125" "1161" "522"
<<"c">>: "801" "756" "432" "288" "405" "432"
<<"a">>: "207" "504" "621" "396" "657" "828"
页: [1] 2
查看完整版本: 求和?