我在filePath
上有一个csv,其中有两列,没有标题
john,304
sarah,300
...
我已经能够这样阅读csv:
import Data.Csv as Csv
import Data.ByteString.Lazy as BL
import Data.Vector as V
...
results <- fmap V.toList . Csv.decode @(String,Integer) Csv.NoHeader <$> BL.readFile filePath
-- Right [("john",300),("sarah",302)]
如果我为csv列自定义了如下数据类型:
data PersonnelData = PersonnelData
{ name :: !String
, amount :: !Integer
} deriving (Show, Generic, Csv.FromRecord)
如何修改上述内容以解码/读取此数据类型的文件?
1条答案
按热度按时间jdgnovmf1#
你有这个地方:
您使用visible type application来 * 显式 * 告诉
Csv.decode
它的第一个类型参数应该是(String, Integer)
类型。让我们看看decode
的签名来了解它的含义:只有一个类型参数,从它出现的地方(输出中)可以很清楚地看出,它就是
decode
解码成的类型。因此Csv.decode @(String,Integer)
是一个 * 显式 * 将CSV记录解码成(String, Integer)
的函数。因此,您需要对代码做的唯一更改就是显式告诉它您希望解码为
PersonnelData
而不是(String, Integer)
。只需使用Csv.decode @PersonnelData
即可。(您需要一个FromRecord
示例,但您已经通过deriving
提供了该示例)