从文件中读取行到 erlang 中的列表,忽略 \n

Reading lines from file to list in erlang, ignoring \n

我需要在 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] ).

好吧,我找到了一个工作正常的解决方案

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

这些输出之间存在差异。

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

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

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

关键是要记住 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"]