读取Csv作为自定义数据类型



我有一个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提供了它)

相关内容

  • 没有找到相关文章

最新更新