我正在尝试使用这样的数据解析 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)
您正在使用show
,它将值用双引号引起来。parseTimeM
正在接收 value "\"2001/12/18\""
,并且它不知道字符串开头和结尾处的引号。删除这些引号,你应该没问题。