2012-01-08 9 views
1

私はキー値のペアを持つJavaのようなプロパティテキストファイルを持っています。そのデータをhaskellにロードしてアクセスするための良いアプローチは何ですか?マップ構造にプロパティファイルをロード

ファイルの外観が好き:

XXXX=vvvvv 
YYYY=uuuuu 

は、私が "XXXX" キーにアクセスできるようにしたいです。

答えて

1

それを目的のマップに変換します。折りたたみの各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を使用してください。

+1

非常に長いリストのオプションについては、foldrがスタックを吹き飛ばす可能性があります。 foldlで書き直すとこれを防ぐことができます。 –

4

優れた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いくつかの詳細、および若干異なるアプローチを探る

関連する問題