Erlang - 打开文件读取行删除行并保存

Posted

技术标签:

【中文标题】Erlang - 打开文件读取行删除行并保存【英文标题】:Erlang - Open file read line delete line and save 【发布时间】:2014-11-12 01:43:31 【问题描述】:

我需要打开一个文件,读取该行,做一些事情,删除该行保存,再次打开同一个文件并继续其余的

到目前为止我有这个代码..

  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.

【问题讨论】:

您也许应该考虑重写,因为打开和关闭文件的要求很高。也许使用一个读取过程,一个写入过程(并创建一个新文件)? 为什么这个问题被标记为 elixir? 为什么这个问题被标记为 ejabberd ? 【参考方案1】:

详细阐述Armon评论:

在服务器故障问答网站,有一篇关于how fast certain operations are的帖子。文件中第一行的磁盘查找需要 10 毫秒,而读取 1Mb 的顺序数据需要 30 毫秒。如果您的文件有 300 行,那么您的解决方案的运行速度会慢 10 倍,如果它有 3000 行,它会比读取 1Mb od 数据慢 100 倍。

在这种情况下,将整个文件作为二进制文件读取到内存中,对这些行做你需要做的事情,最后再次保存文件。您可以在进程之间分配工作,但我不会打扰,因为访问磁盘可能是您代码中最长的操作。

【讨论】:

以上是关于Erlang - 打开文件读取行删除行并保存的主要内容,如果未能解决你的问题,请参考以下文章

如何删除错误行错误的行并使用 pandas 或 numpy 读取剩余的 csv 文件?

Python在文件中查找字符串,编辑行并保存到新文件

读取字符行并获取文件位置

使用 BufferedReader 读取行并检查文件结尾

C ++从文本文件中读取行并编辑

如何从 .CSV 文件中删除不合适的行并使用 C# 再次保存该文件?