我试图解析一个包含德语文本的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
。但是,用于将字符串文字编码为ByteString
的ByteString
s的IsString
实例不使用UTF-8编码,而是将每个字符编码为其代码点的最低有效字节(这基本上是对于非ASCII字符串来说永远不要(。