用木薯从 csv 解析日期

Joh*_*ohn 6 haskell

我正在尝试使用这样的数据解析 csv 文件。我可以将日期解析为字符串,但无法以日格式获取它们。我终于得到了这个来进行类型检查,但现在我有一个解析错误,希望得到一些帮助。

2001/12/18, 281
2001/12/19, 280
2001/12/20, 276
2001/12/21, 278
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是我的代码。

{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}

import qualified Data.ByteString.Lazy as BL
import Data.Csv
import qualified Data.Vector as V
import Data.Time
import Generics.Deriving

datadir="/home/john/.stack/test/data/"  

data Sample = Sample { dateMeasure :: !Data.Time.Day 
                 , valueMeasure :: !Int 
                 } deriving (Generic, Show)   

instance FromRecord Sample 

instance FromField Data.Time.Day where
    parseField = parseTimeM True defaultTimeLocale "%Y/%m/%d" . show 

printRecord :: Sample -> IO ()
printRecord r  = putStrLn $  show (dateMeasure r) ++ " measurement is " ++    show (valueMeasure r) 

main :: IO ()
main = do
    csvData <- BL.readFile $ datadir ++ "sample.csv"
    case decode NoHeader csvData :: Either String (V.Vector Sample) of
        Left err -> putStrLn err
        Right v -> V.forM_ v $ printRecord   
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误

~/.stack/test/ stack exec test
parse error (Failed reading: conversion error: parseTimeM: no parse of "\"2001/12/18\"") at 
2001/12/19, 280
2001/12/20, 276
2001/12/21, 278
2001/12/26, 278
2001/12/27, 278
2001/12/28, 2 (truncated)
Run Code Online (Sandbox Code Playgroud)

Cha*_*ert 4

您正在使用show,它将值用双引号引起来。parseTimeM正在接收 value "\"2001/12/18\"",并且它不知道字符串开头和结尾处的引号。删除这些引号,你应该没问题。