haskell 阅读Csv作为自定义数据类型

kxkpmulp  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(133)

我在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)

如何修改上述内容以解码/读取此数据类型的文件?

jdgnovmf

jdgnovmf1#

你有这个地方:

Csv.decode @(String,Integer)

您使用visible type application来 * 显式 * 告诉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提供了该示例)

相关问题