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