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
-module(t).
-compile(export_all).
get_same_seq() ->
{ok, F} = file:open("in.txt", [binary, read]),
all_line(F).
all_line(F) ->
case io:get_line(F, "") of
eof -> file:close(F);
L ->
Line = binary:replace(L, <<"\n">>, <<>>),
[N | V] = binary:split(Line, <<" ">>, [global]),
case ets:lookup(sum, N) of
[{N, Old}] ->
New = [all_line_1(V1) || V1 <- V],
%[V1,V2,V3,V4,V5,V6] = Old,
%io:format("Old: ~p ~p ~p ~p ~p ~p ~n",[V1,V2,V3,V4,V5,V6]),
Add = lists:zipwith(fun (C1, C2) ->
list_to_integer(C1) +
list_to_integer(C2)
end,
New, Old),
Add1 = [all_line_2(V2) || V2 <- Add],
ets:insert(sum, {N, Add1});
[] ->
Init = [all_line_3(V3) || V3 <- V],
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([H | T]) ->
case H of
{N, [V1, V2, V3, V4, V5, V6]} ->
io:format("~p: ~p ~p ~p ~p ~p ~p ~n",
[N, V1, V2, V3, V4, V5, V6]);
{<<>>, []} -> skip
end,
p(T);
p([]) -> done.
main() ->
ets:new(sum,
[named_table, public, {write_concurrency, true}]),
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"
复制代码
作者:
shijiang1130
时间:
2016-04-20 17: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
b 21 41 12 61 62 24
c 25 17 14 21 22 14
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 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 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 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 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 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 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 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
复制代码
作者:
patagonia2
时间:
2016-04-20 20:59
回复
9#
shijiang1130
-module(t).
令人兴奋。
er语言不常见
但觉得语法特别的优雅
然后就被震撼了
呵呵我要收藏
作者:
patagonia2
时间:
2016-04-20 21:19
回复
11#
shijiang1130
大圣你好。
乍看之下很怪
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