erlang从文件末尾的位置列出行
有没有可能有一个函数从末尾返回x行文件?该函数将使用参数定义我们要从端点读取的距离(行内测量)以及我们要从该位置返回的行数:erlang从文件末尾的位置列出行,erlang,Erlang,有没有可能有一个函数从末尾返回x行文件?该函数将使用参数定义我们要从端点读取的距离(行内测量)以及我们要从该位置返回的行数: get_lines_file_end(IoDevice, LineNumberPositionFromEnd, LineCount) -> 例如: 我们有30行0-29的文件 get_lines_file_end(IoDevice, -10, 10) // will return lines 20-29 get_lines_file_end(IoDevice, -
get_lines_file_end(IoDevice, LineNumberPositionFromEnd, LineCount) ->
例如:
我们有30行0-29的文件
get_lines_file_end(IoDevice, -10, 10) // will return lines 20-29
get_lines_file_end(IoDevice, -20, 10) // will return lines 10-19
这里的问题是,我只能用file:position按一定的字节数进行搜索
目的:
从最后一个“页面”开始,以页面方式查看大型日志文件(数百MB)。
Erlang用于javascript web使用的RESTAPI
该函数的用途是逐页查看整个日志文件,其中页面由x行文本表示。不需要处理日志文件,也不需要获取日志文件的某些信息
谢谢您可以使用读取行,丢弃与您的范围不匹配的行:
From>0->
获取行(文件,文件:读取行(文件),从,1)。
获取行(\u文件、eof、\u来源、\u当前)->
[];
当当前<从->时,获取_行(文件,{ok,_行},从,当前)
获取行(文件,文件:读取行(文件),从,当前+1);
获取_行(文件,{ok,Line},From,Current)->
[行|获取行(文件,文件:读取行(文件),从,当前+1)];
获取线路(IoDevice、Error、From、Current)->
错误。
您可以使用读取行,丢弃与您的范围不匹配的行:
From>0->
获取行(文件,文件:读取行(文件),从,1)。
获取行(\u文件、eof、\u来源、\u当前)->
[];
当当前<从->时,获取_行(文件,{ok,_行},从,当前)
获取行(文件,文件:读取行(文件),从,当前+1);
获取_行(文件,{ok,Line},From,Current)->
[行|获取行(文件,文件:读取行(文件),从,当前+1)];
获取线路(IoDevice、Error、From、Current)->
错误。
您可以使用读取行,丢弃与您的范围不匹配的行:
From>0->
获取行(文件,文件:读取行(文件),从,1)。
获取行(\u文件、eof、\u来源、\u当前)->
[];
当当前<从->时,获取_行(文件,{ok,_行},从,当前)
获取行(文件,文件:读取行(文件),从,当前+1);
获取_行(文件,{ok,Line},From,Current)->
[行|获取行(文件,文件:读取行(文件),从,当前+1)];
获取线路(IoDevice、Error、From、Current)->
错误。
您可以使用读取行,丢弃与您的范围不匹配的行:
From>0->
获取行(文件,文件:读取行(文件),从,1)。
获取行(\u文件、eof、\u来源、\u当前)->
[];
当当前<从->时,获取_行(文件,{ok,_行},从,当前)
获取行(文件,文件:读取行(文件),从,当前+1);
获取_行(文件,{ok,Line},From,Current)->
[行|获取行(文件,文件:读取行(文件),从,当前+1)];
获取线路(IoDevice、Error、From、Current)->
错误。
需要指出两点:
file:position/2
查找,直接跳到所需的位1> {ok, Data} = file:read_file("TheLongDarkTeaTimeOfTheSoul.txt").
{ok,<<"Douglas Adams. The Long Dark Tea-Time of the Soul\r\n\r\n"...>>}
2> LineEnds = binary:matches(Data, <<"\r\n">>).
[{49,2},
{51,2},
{53,2},
{...}|...]
1>{ok,Data}=file:read_文件(“thelongdarkteatimeofsoul.txt”)。
{好的,}
2> LineEnds=binary:匹配(数据,)。
[{49,2},
{51,2},
{53,2},
{...}|...]
然后将LineEnds
另存为文件本身的meta。在文件数据中使用此搜索是基本的(如中所示,使用file:position/2
,数据位于换行符X或length(LineEnds)-X
或其他位置)
但这仍然是愚蠢的
如果您想在日志文件中四处跳跃,特别是如果您想能够在日志文件中找到模式,计算模式的某些方面,等等,那么您几乎可以肯定会更好地将它们逐行读取到数据库中,如Postgres,边走边计算行号。在这一点上,分页成为一个微不足道的问题
然而,日志文件通常充满了最好用符号来表示的数据,而不是实际的文本,因此对日志文件进行标记可能是更好的方法。考虑访问日志文件的情况。从有限数量的接入点(IP、设备或其他)重复访问任意次数的访问者。这方面的每个方面都可以在数据库中单独索引和比较。标记化本身也相当简单。这种解决方案不仅在以后对数据进行分析时要快得多,而且还能够自然地以非常直截了当和熟悉的方式回答关于数据内容的问题。。。而且您甚至不必丢失任何原始数据或处理的中间阶段(它们可能以不同的方式独立使用)
还有。。。请注意,上述所有工作都可以在Erlang中非常轻松地并行进行