【问题标题】:Reading lines from file to list in erlang, ignoring \n在erlang中从文件读取行到列表,忽略\ n
【发布时间】:2015-01-26 06:29:56
【问题描述】:

我需要在 erlang 中读取我的 txt 文件的每一行并列出它。 问题是我的列表如下所示: ["line1\n","line2\n","line3"] 列表的每个元素(最后一个元素旁边)都有“\n”部分,我需要它消失。你能帮我么? 我也会用它来读取大文件(比如 200000+ 行)

代码如下:

-module(test1).
-export([into_list/1]).

into_list( File ) ->
  {ok, IO} = file:open( File, [read] ),
  into_list( io:get_line(IO, ''), IO, [] ).


into_list( eof, _IO, Acc ) -> lists:reverse( Acc );
into_list( {error, _Error}, _IO, Acc ) -> lists:reverse( Acc );
into_list( Line, IO, Acc ) -> into_list( io:get_line(IO, ''), IO, [Line | Acc] ).

【问题讨论】:

    标签: list erlang readfile


    【解决方案1】:

    我找到了一个很好的解决方案

      readfile(FileName) ->
      {ok, Binary} = file:read_file(FileName),
      Lines = string:tokens(erlang:binary_to_list(Binary), "\n").
    

    【讨论】:

    • 这种方法的一个问题是,如果您正在读取超过 200,000 行的文件,您会将整个文件读入内存,然后将其全部转换为列表,然后为每个文件创建单独的列表单线。如果您愿意将整个文件读入一个二进制文件,则应考虑使用 binary:split(Binary,<<"\n">>,[global]) 将其分成几行,因为这样会占用更少的内存。
    【解决方案2】:

    关键是要记住,Erlang 中的 string 只不过是整数列表。

    因此,由于您习惯于将整个文件作为二进制文件读取,因此您可以编写类似的内容以将内容作为 string 列表取回:

    1> {ok, Binary} = file:read_file("test.txt").
    {ok,<<"aaaa\nb\nvvvvv\nxxx\n">>}
    2> [binary_to_list(Bin) || Bin <- binary:split(Binary,<<"\n">>,[global])].
    ["aaaa","b","vvvvv","xxx",[]]
    

    如果您不满意在列表末尾取回[],您可以使用保护子句:

    3> [binary_to_list(Bin) || Bin <- binary:split(Binary,<<"\n">>,[global]),
                               Bin =/= << >>].    
    ["aaaa","b","vvvvv","xxx"]
    

    【讨论】:

      【解决方案3】:

      这些输出之间存在差异。

      string:tokens(erlang:binary_to_list(Binary), "\n"). ["aaaa","b","vvvvv","xxx"]

      binary:split(Binary,<<"\n">>,[global]). [<<"aaaa">>,<<"b">>,<<"vvvvv">>,<<"xxx">>,<<>>]

      但正如史蒂夫所说,第二个更快。 我的问题是,如何从第二个输出中消除 > ?

      【讨论】:

      • 在选项中添加trim
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多