Chinaunix

标题: 求和? [打印本页]

作者: 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
......

请问怎么实现
谢谢!
作者: 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 写一个,写一个,写一个


   
作者: q1208c    时间: 2016-04-20 12:11
回复 5# shijiang1130

你来。
   
作者: shijiang1130    时间: 2016-04-20 12:54
回复 6# q1208c

想写来着,但不知道怎么匹配 “...”,不但要自己写,还要自己造数据,工程太麻烦
   
作者: q1208c    时间: 2016-04-20 13:01
回复 7# shijiang1130
可以先用楼主的数据呀。

够用了。

   
作者: shijiang1130    时间: 2016-04-20 17:55
  1. -module(t).

  2. -compile(export_all).

  3. get_same_seq() ->
  4.     {ok, F} = file:open("in.txt", [binary, read]),
  5.     all_line(F).

  6. all_line(F) ->
  7.     case io:get_line(F, "") of
  8.       eof -> file:close(F);
  9.       L ->
  10.           Line = binary:replace(L, <<"\n">>, <<>>),
  11.           [N | V] = binary:split(Line, <<" ">>, [global]),
  12.           case ets:lookup(sum, N) of
  13.             [{N, Old}] ->
  14.                 New = [all_line_1(V1) || V1 <- V],
  15.                 %[V1,V2,V3,V4,V5,V6]  = Old,
  16.                 %io:format("Old: ~p ~p ~p ~p ~p ~p ~n",[V1,V2,V3,V4,V5,V6]),
  17.                 Add = lists:zipwith(fun (C1, C2) ->
  18.                                             list_to_integer(C1) +
  19.                                               list_to_integer(C2)
  20.                                     end,
  21.                                     New, Old),
  22.                 Add1 = [all_line_2(V2) || V2 <- Add],
  23.                 ets:insert(sum, {N, Add1});
  24.             [] ->
  25.                 Init = [all_line_3(V3) || V3 <- V],
  26.                 ets:insert(sum, {N, Init})
  27.           end,
  28.           all_line(F)
  29.     end.

  30. all_line_1(A1) -> binary_to_list(A1).

  31. all_line_2(_T) -> integer_to_list(_T).

  32. all_line_3(A1) -> binary_to_list(A1).

  33. p([H | T]) ->
  34.     case H of
  35.       {N, [V1, V2, V3, V4, V5, V6]} ->
  36.           io:format("~p: ~p ~p ~p ~p ~p ~p ~n",
  37.                     [N, V1, V2, V3, V4, V5, V6]);
  38.       {<<>>, []} -> skip
  39.     end,
  40.     p(T);
  41. p([]) -> done.

  42. main() ->
  43.     ets:new(sum,
  44.             [named_table, public, {write_concurrency, true}]),
  45.     get_same_seq(),
  46.     Result = ets:tab2list(sum),
  47.     p(Result).
复制代码

作者: shijiang1130    时间: 2016-04-20 17:56
  1. 100> t:main().
  2. <<"b">>: "396" "783" "396" "1125" "1161" "522"
  3. <<"c">>: "801" "756" "432" "288" "405" "432"
  4. <<"a">>: "207" "504" "621" "396" "657" "828"
复制代码

作者: shijiang1130    时间: 2016-04-20 17:56
  1. a 11 23 34 22 34 56
  2. b 23 46 32 64 67 34
  3. c 64 67 34 11 23 34
  4. a 12 33 35 22 39 36
  5. b 21 41 12 61 62 24
  6. c 25 17 14 21 22 14
  7. a 11 23 34 22 34 56
  8. b 23 46 32 64 67 34
  9. c 64 67 34 11 23 34
  10. a 12 33 35 22 39 36
  11. b 21 41 12 61 62 24
  12. c 25 17 14 21 22 14
  13. a 11 23 34 22 34 56
  14. b 23 46 32 64 67 34
  15. c 64 67 34 11 23 34
  16. a 12 33 35 22 39 36
  17. b 21 41 12 61 62 24
  18. c 25 17 14 21 22 14
  19. a 11 23 34 22 34 56
  20. b 23 46 32 64 67 34
  21. c 64 67 34 11 23 34
  22. a 12 33 35 22 39 36
  23. b 21 41 12 61 62 24
  24. c 25 17 14 21 22 14
  25. a 11 23 34 22 34 56
  26. b 23 46 32 64 67 34
  27. c 64 67 34 11 23 34
  28. a 12 33 35 22 39 36
  29. b 21 41 12 61 62 24
  30. c 25 17 14 21 22 14
  31. a 11 23 34 22 34 56
  32. b 23 46 32 64 67 34
  33. c 64 67 34 11 23 34
  34. a 12 33 35 22 39 36
  35. b 21 41 12 61 62 24
  36. c 25 17 14 21 22 14
  37. a 11 23 34 22 34 56
  38. b 23 46 32 64 67 34
  39. c 64 67 34 11 23 34
  40. a 12 33 35 22 39 36
  41. b 21 41 12 61 62 24
  42. c 25 17 14 21 22 14
  43. a 11 23 34 22 34 56
  44. b 23 46 32 64 67 34
  45. c 64 67 34 11 23 34
  46. a 12 33 35 22 39 36
  47. b 21 41 12 61 62 24
  48. c 25 17 14 21 22 14
  49. a 11 23 34 22 34 56
  50. b 23 46 32 64 67 34
  51. c 64 67 34 11 23 34
  52. a 12 33 35 22 39 36
  53. b 21 41 12 61 62 24
  54. c 25 17 14 21 22 14

复制代码

作者: patagonia2    时间: 2016-04-20 20:59
回复 9# shijiang1130

-module(t).


令人兴奋。
er语言不常见
但觉得语法特别的优雅
然后就被震撼了

呵呵我要收藏
作者: patagonia2    时间: 2016-04-20 21:19
回复 11# shijiang1130

大圣你好。
乍看之下很怪
  1. binary_to_list -> list_to_integer ->  integer_to_list
复制代码
请问大圣这种情况怎么不用这binary_to_integer处理呢
求教

   
作者: patagonia2    时间: 2016-05-24 17:31
大圣的
答案永远是
最给力的,
学习了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2