我正在尝试解析包含德语文本的 CSV 文件,即它不是用“逗号”分隔,而是用分号分隔,并且可能包含变音符号(\xc3\xa4\xc3\xb6\xc3\xbc 等)。
\n使用Cassava并按照链接的教程进行操作,对于标题包含变音符号的列,我收到错误:
\n\n\n解析错误(读取失败:转换错误:在“\\nEUR;0,99”处没有名为“W\\228hrung”的字段)
\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\nRun Code Online (Sandbox Code Playgroud)\n将其另存为bank.csv:
W\xc3\xa4hrung;Betrag\nEUR;14,12\nEUR;0,99\nRun Code Online (Sandbox Code Playgroud)\n版本:\nGHC 8.10.7\ncassava ^>=0.5.2.0
\n你需要写:
\nimport 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"\nRun Code Online (Sandbox Code Playgroud)\n问题在于,cassava在内部将字段名称表示为ByteString文本的 UTF-8 编码。然而,用于将字符串文字编码为 aIsString的 s 实例不使用UTF-8 编码,而是将每个字符编码为其代码点的最低有效字节(这基本上不是您想要的非 ASCII 编码)字符串)。ByteStringByteString