使用 Cassava 和 Attoparsec 解析自定义字段

问题描述 投票:0回答:1

我有一个 CSV,其中的字段包含我必须解析的单位值。举个简单的例子:

data EValue = Farads Double | MicroFarads Double | PicoFarads Double

因此我需要解析如下内容:

parseEValue = farads <|> micro <|> pico
  where farads = Farads <$> double <* string "F"
        micro  = MicroFarads <$> double <* string "µF"
        pico   = PicoFarads <$> double <* string "pF"

如何将其包含在

FromField
Cassava
的实例定义中?

instance FromField EValue where
  parseField = ???
csv parsing haskell attoparsec
1个回答
3
投票

你只需要在得到的

Field
上运行 attoparsec,然后将结果放入
Parser
monad 中,如下所示:
parseField = either fail pure . parseOnly parseEValue

为了完整起见,以下是所有内容:

{-# LANGUAGE OverloadedStrings #-}

import Control.Applicative
import Data.Attoparsec.ByteString.Char8
import Data.Csv

data EValue = Farads Double | MicroFarads Double | PicoFarads Double

parseEValue = farads <|> micro <|> pico
  where farads = Farads <$> double <* string "F"
        micro  = MicroFarads <$> double <* string "µF"
        pico   = PicoFarads <$> double <* string "pF"

instance FromField EValue where
  parseField = either fail pure . parseOnly parseEValue

在一个不相关的注释中,

string "µF"
不太可能做你想做的事。您可能想要像
import qualified Data.Text.Encoding as T
string (T.encodeUtf8 "µF")
这样的东西。有关详细信息,请参阅通过 IsString 实现 ByteString 文字的令人惊讶的行为

© www.soinside.com 2019 - 2024. All rights reserved.