从文件中读取行到 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"]
我需要在 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"]