巨大なログファイルを解析する必要があります。そして私はハスケルで学習目的のためにそれをやりたいと思っています(私は初心者です)。 ログファイルのレイアウトのようなものです: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'と明示的な再帰を使って' errors'セクションをスライスすることができます。または 'groupBy'があなたのリストを' [[param1]、[err1、err2、err3]、[param2]、[err4]、[param3]] 'として大まかにグループ化し、欲しかった – chi
このためには、[Parsec](https://hackage.haskell.org/package/parsec-3.1.11/docs/Text-Parsec.html)などの解析ライブラリを使用してこのような作業を行います。 breeze – jkeuhlen
これは私のコード・レビューに関する質問と類似していますので、[there](http://codereview.stackexchange.com/questions/147874/kattis-speed-limit-read-irregular-input)をチェックしてください。 – wizzup