木薯无法识别带有变音符号的命名字段
Named field with Umlaut not recognized with Cassava
我正在尝试解析包含德语文本的 CSV 文件,即它不是以“逗号”分隔,而是以分号分隔,并且可能包含变音符号(äöü 等)。
使用 Cassava and following the linked tutorial,对于包含变音符号的 header 的列,我收到错误:
parse error (Failed reading: conversion error: no field named "W8hrung") at "\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 编码,而是将每个字符编码为其代码点的最低有效字节(这基本上是 never 你想要的非 ASCII 字符串)。
我正在尝试解析包含德语文本的 CSV 文件,即它不是以“逗号”分隔,而是以分号分隔,并且可能包含变音符号(äöü 等)。
使用 Cassava and following the linked tutorial,对于包含变音符号的 header 的列,我收到错误:
parse error (Failed reading: conversion error: no field named "W8hrung") at "\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 编码,而是将每个字符编码为其代码点的最低有效字节(这基本上是 never 你想要的非 ASCII 字符串)。