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

时间:2015-01-23 21:38:04

标签: list erlang readfile

我需要在erlang中读取我的txt文件的每一行并列出它。 问题是我的列表看起来像这样: [ “LINE1 \ n”, “第2行\ n”, “3号线”] 列表中的每个元素(在最后一个元素旁边)都有“\ 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] ).

3 个答案:

答案 0 :(得分:3)

我发现一个解决方案正常工作

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

答案 1 :(得分:0)

这些产出之间存在差异。

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

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

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

答案 2 :(得分:0)

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