带有元音变音符的命名字段无法被Cassava识别



我试图解析一个包含德语文本的CSV文件,即它不是"逗号";分隔的,但分号分隔的,它可能包含元音变音符(äüetc(。

使用Cassava并按照链接的教程,对于一个标题包含元音变音符的列,我得到了错误:

在"处解析错误(读取失败:转换错误:没有名为"W\228hrung"的字段(;\nEUR;0,99〃;

MRE:

{-# LANGUAGE OverloadedStrings, TypeApplications #-}
import Data.Char
import qualified Data.ByteString.Lazy as ByteString
import Data.Csv
import Data.Text
myOpts = defaultDecodeOptions {
decDelimiter = fromIntegral (ord ';')
}
data Transaction = Tx
{ waehrung :: Text
, betrag :: Text
} deriving Show
instance FromNamedRecord Transaction where
parseNamedRecord m =
Tx
<$> m .: "Währung"
<*> m .: "Betrag"
main :: IO ()
main =
ByteString.readFile "bank.csv"
>>= print . decodeByNameWith @Transaction myOpts

将其另存为bank.csv:

Währung;Betrag
EUR;14,12
EUR;0,99

版本:GHC 8.10.7木薯^>0.5.2.0

您需要编写:

import qualified Data.Text.Encoding as Text
instance FromNamedRecord Transaction where
parseNamedRecord m =
Tx
<$> m .: Text.encodeUtf8 "Währung"
<*> m .: "Betrag"

问题是cassava在内部将字段名表示为文本的UTF-8编码的ByteString。但是,用于将字符串文字编码为ByteStringByteStrings的IsString实例不使用UTF-8编码,而是将每个字符编码为其代码点的最低有效字节(这基本上是对于非ASCII字符串来说永远不要(。

相关内容

  • 没有找到相关文章

最新更新