私はキー値のペアを持つJavaのようなプロパティテキストファイルを持っています。そのデータをhaskellにロードしてアクセスするための良いアプローチは何ですか?マップ構造にプロパティファイルをロード
ファイルの外観が好き:
XXXX=vvvvv
YYYY=uuuuu
は、私が "XXXX" キーにアクセスできるようにしたいです。
私はキー値のペアを持つJavaのようなプロパティテキストファイルを持っています。そのデータをhaskellにロードしてアクセスするための良いアプローチは何ですか?マップ構造にプロパティファイルをロード
ファイルの外観が好き:
XXXX=vvvvv
YYYY=uuuuu
は、私が "XXXX" キーにアクセスできるようにしたいです。
それを目的のマップに変換します。折りたたみの各step
は、単一の行を検査し、それをキー/値ペアに解析しようと試み、成功した場合にマップに挿入します。
parseOpt
は未定義です。あなたはehirdのparseField
のようなアプローチを使うことができます。あなたが(例えば)オプション「XX」とオプション「XXXX」を持っている場合は、接頭辞テスト手法を使用して
interestingOpts = ["XXXX", "YYYY"]
parseOpt line = case find (`isPrefixOf` line) interestingOpts of
Just key -> Just (key, drop 1 $ dropWhile (/= '=') line)
Nothing -> Nothing
は、しかし、常に最高のアイデアではありません。おそらく、あなたが唯一の特定のオプションを解析することを好みます。あなたのデータに最も適したアプローチを試してみてください。 には、の高性能が必要な場合は、String
の代わりにData.Textを使用してください。
優れたParsec(Haskellプラットフォームの一部)のようなパーサーライブラリを使用できます。シンプルな形式のパーサーを書くには数分しかかかりません。
しかし、それが本当に簡単な場合は、splitを使用できます。文字列を標準lines
関数を使用して行に分割し(空白行などを処理する必要がある場合はData.List.Splitを使用)、Data.List.Split関数を使用して'='
に分割します。
は、最も簡単な解決策はbreak
を使用して独自の圧延することになります。
import Control.Arrow
parse :: String -> [(String, String)]
parse = map parseField . lines
where parseField = second (drop 1) . break (== '=')
しかし、これは空白、空白行、またはそのようなものを処理しません。キーで検索するためのよう
あなたは[(String, String)]
のような構造を持っていたら、それは(fromList
で)Mapにそれを入れて、その上で動作するのは簡単です。ファイル内の行のリストを取る:私は倍としてあなたの問題に私の解決策を表明しました
import qualified Data.Map as Map
type Key = String
type Val = String
main = do
-- get contents of file (contents :: String)
contents <- readFile "config.txt"
-- split into lines (optionList :: [String])
let optionList = lines contents
-- parse into map (optionMap :: Map Key Val)
let optionMap = optionMapFromList optionList
doStuffWith optionMap
optionMapFromList :: [String] -> Map.Map Key Val
optionMapFromList = foldr step Map.empty
where step line map = case parseOpt line of
Just (key, val) -> Map.insert key val map
Nothing -> map
parseOpt :: String -> Maybe (Key, Val)
parseOpt = undefined
:言及しなかったehirdいくつかの詳細、および若干異なるアプローチを探る
非常に長いリストのオプションについては、foldrがスタックを吹き飛ばす可能性があります。 foldlで書き直すとこれを防ぐことができます。 –