我正在嘗試決議包含德語文本的 CSV 檔案,即它不是“逗號”分隔,而是分號分隔,并且可能包含元音變音(??ü 等)。
使用Cassava并遵循鏈接的教程,對于標題包含變音符號的列,我收到錯誤:
決議錯誤(讀取失敗:轉換錯誤:沒有名為“W\228hrung”的欄位)在“\nEUR;0,99”
導致錯誤的最小 CSV 檔案是:
W?hrung;Betrag
EUR;14,12
EUR;0,99
資料型別和FromNamedRecord實體:
data Transaction = Tx
{ waehrung :: Text
, betrag :: Betrag
}
instance FromNamedRecord Transaction where
parseNamedRecord m =
Tx
<$> m .: "W?hrung"
<*> m .: "Betrag"
CSV 編碼為 UTF-8,我在 main.xml 中設定setLocaleEncoding utf8。像本教程中,我使用的OverloadedStrings擴展,所以"W?hrung"是一個ByteString。
版本:GHC 8.10.7 木薯^>=0.5.2.0
包含 Cabal 檔案和 CSV 的完整 MRE 代碼可以在這個 Gist 中找到
uj5u.com熱心網友回復:
你需要寫:
instance FromNamedRecord Transaction where
parseNamedRecord m =
Tx
<$> m .: Text.encodeUtf8 "W?hrung"
<*> m .: "Betrag"
問題是cassava在內部將欄位名稱表示為ByteString文本的 UTF-8 編碼。然而,IsString例如ByteString,用來編碼字串文本A SByteString并沒有使用UTF-8編碼而編碼的每個字符作為代碼點的最低顯著位元組(這基本上是從來沒有你想要的非ASCII字串)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/407257.html
標籤:
上一篇:PythonCSV不同的分隔符
