我需要打开一个文件,读取该行,做一些事情,删除该行保存,再次打开同一个文件并继续其余部分
到目前为止,我有这段代码..
1 -module(setup_data).
2 -export([for_each_line_in_file/1]).
3
4 for_each_line_in_file(Name) ->
5 {ok, Device} = file:open(Name, [read]),
6 for_each_line(Device).
7
8 for_each_line(Device) ->
9 case io:get_line(Device, "") of
10 eof -> file:close(Device);
11 Line ->
12 do_something(Line)
13 for_each_line(Device)
14 end.
所以我想要像
这样的东西 1 -module(setup_data).
2 -export([for_each_line_in_file/1]).
3
4 for_each_line_in_file(Name) ->
4
6 for_each_line(Name).
7
8 for_each_line(Device) ->
9 {ok, Device} = file:open(Name, [read]),
9 case io:get_line(Device, "") of
10 eof -> file:close(Device);
11 Line ->
12 io:format("LINE : ...... ~p~n",[Line]),
23
43 /DELETE THAT CURRENT LINE AND SAVE?
33 file:close(Device)
13 for_each_line(Name)
14 end.
答案 0 :(得分:0)
详细说明Armon评论:
在服务器故障q&网站中,有一篇关于how fast certain operations are的帖子。磁盘搜索文件中的第一行需要10毫秒,而读取1Mb的顺序数据需要30毫秒。如果你的文件有300行,那么你的解决方案的工作速度会慢10倍,如果它有3000行,那么它将比读取1Mb的数据慢100倍。
在这种情况下,将整个文件作为二进制文件读取到内存中,执行您需要对行执行的操作,最后再次保存文件。您可以在进程之间分配工作,但我不会打扰,因为访问磁盘可能是代码中运行时间最长的操作。