Cassava 无法识别带有 Umlaut 的命名字段

Ben*_*rer 3 csv haskell

我正在尝试解析包含德语文本的 CSV 文件,即它不是用“逗号”分隔,而是用分号分隔,并且可能包含变音符号(\xc3\xa4\xc3\xb6\xc3\xbc 等)。

\n

使用Cassava并按照链接的教程进行操作,对于标题包含变音符号的列,我收到错误:

\n
\n

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

\n
\n

再次:

\n
{-# LANGUAGE OverloadedStrings, TypeApplications #-}\n\nimport Data.Char\nimport qualified Data.ByteString.Lazy as ByteString\nimport Data.Csv\nimport Data.Text\n\nmyOpts = defaultDecodeOptions {\n      decDelimiter = fromIntegral (ord \';\')\n  }\n\ndata Transaction = Tx\n  { waehrung :: Text\n  , betrag :: Text\n  } deriving Show\n\ninstance FromNamedRecord Transaction where\n  parseNamedRecord m =\n    Tx\n      <$> m .: "W\xc3\xa4hrung"\n      <*> m .: "Betrag"\n\nmain :: IO ()\nmain =\n  ByteString.readFile "bank.csv"\n    >>= print . decodeByNameWith @Transaction myOpts\n
Run Code Online (Sandbox Code Playgroud)\n

将其另存为bank.csv

\n
W\xc3\xa4hrung;Betrag\nEUR;14,12\nEUR;0,99\n
Run Code Online (Sandbox Code Playgroud)\n

版本:\nGHC 8.10.7\ncassava ^>=0.5.2.0

\n

K. *_*uhr 6

你需要写:

\n
import qualified Data.Text.Encoding as Text\ninstance FromNamedRecord Transaction where\n  parseNamedRecord m =\n    Tx\n      <$> m .: Text.encodeUtf8 "W\xc3\xa4hrung"\n      <*> m .: "Betrag"\n
Run Code Online (Sandbox Code Playgroud)\n

问题在于,cassava在内部将字段名称表示为ByteString文本的 UTF-8 编码。然而,用于将字符串文字编码为 aIsString的 s 实例不使用UTF-8 编码,而是将每个字符编码为其代码点的最低有效字节(这基本上不是您想要的非 ASCII 编码)字符串)。ByteStringByteString

\n