我有一个csv在某些filePath
有两列没有标题
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)
我如何修改上面的代码来解码/读取这个数据类型的文件?
哪里有这个:
Csv.decode @(String,Integer)
你正在使用一个可见类型应用程序显式地告诉Csv.decode
它的第一个类型参数应该是类型(String, Integer)
。让我们看一下decode
的签名,看看这是什么意思:
decode :: FromRecord a
=> HasHeader
-> ByteString
-> Either String (Vector a)
只有一个类型参数,从它出现的地方(在输出中)可以很清楚地看出它是decode
解码成的类型。所以Csv.decode @(String,Integer)
是一个函数,显式地将CSV记录解码为(String, Integer)
。
PersonnelData
而不是(String, Integer)
。只要使用Csv.decode @PersonnelData
。(您需要一个FromRecord
实例,但您已经通过deriving
提供了它)