我需要解析一个巨大的日志文件。我想在Haskell中学习目的(我是初学者)。 日志文件的布局是这样的:解析Haskell中的日志文件
parameter a_parameter_name errors: 5
error bla bla1
error bla bla2
error bla bla bla3
error bla bla bla4
error bla bla bla5
some garbage line
parameter an_other_parameter_name errors: 7
error bla bla1
error bla bla2
error bla bla3
error bla bla4
error bla bla5
error bla bla6
error bla bla7
some garbage line
some garbage line
some garbage line
...
该日志文件包含2种主线类型:按“参数”开始
- 线;
- 以“error”开头的行。
“错误”行与前一参数行相关。 其他线条不感兴趣。
我想要做的是打印出错误数量排序的参数及其错误。所以在这里我想获得:
parameter an_other_parameter_name errors: 7
error bla bla1
error bla bla2
error bla bla3
error bla bla4
error bla bla5
error bla bla6
error bla bla7
parameter a_parameter_name errors: 5
error bla bla1
error bla bla2
error bla bla bla3
error bla bla bla4
error bla bla bla5
用下面的代码,我得到的有趣线
import System.IO
import Data.List
interesting :: String -> Bool
interesting s = isPrefixOf "parameter" s || isPrefixOf "error" s
main = do
logFile <- openFile "log.txt" ReadMode
contents <- hGetContents logFile
let interestingLines = filter interesting $ lines contents
print interestingLines
hClose logFile
从这个列表名单,我想构建三元组的列表: [ (参数,errorsNb,[errors])],我可以排序并打印出来。 但我不知道如何将错误行与其相关的参数行进行分组。但也许这不是正确的做法... 欢迎任何帮助!
奥利弗
有多种选择。你可以使用'span'和显式递归来分割“错误”部分。或者你可能希望'groupBy'粗略地将你的列表分组为[[param1],[err1,err2,err3],[param2],[err4],[param3]],然后再做更多的处理,通缉。 – chi
你应该看看使用一个解析库,例如[Parsec](https://hackage.haskell.org/package/parsec-3.1.11/docs/Text-Parsec.html)使这种工作成为微风 – jkeuhlen
这与我在代码审查的问题有一些相似之处,你可能想检查[有](http://codereview.stackexchange.com/questions/147874/kattis-speed-limit-read-irregular-input)。 – wizzup