module Data.TimeSeries.IO.CSVReader
( HasHeader(..)
, loadCSV
)where
import Prelude
import qualified Data.ByteString.Lazy as BS
import qualified Data.Text as T
import qualified Data.Csv as CSV
import qualified Data.Vector as V
import Data.Time (UTCTime)
import Data.TimeSeries.Series ( Series
, emptySeries
, series
)
data HasHeader = HasHeader | NoHeader
loadCSV :: HasHeader -> (T.Text -> UTCTime) -> FilePath -> IO (Series Double)
loadCSV hasHeader ft filePath = do
csvData <- BS.readFile filePath
case CSV.decode (toCSVHeader hasHeader) csvData of
Left err -> do
_ <- putStrLn err
return emptySeries
Right vs -> do
let vs' = V.map (parseLine ft) vs
return $ series (V.toList vs')
toCSVHeader :: HasHeader -> CSV.HasHeader
toCSVHeader HasHeader = CSV.HasHeader
toCSVHeader _ = CSV.NoHeader
parseLine :: (T.Text -> UTCTime) -> (T.Text, Double) -> (UTCTime, Double)
parseLine ft (date, value) = (ft date, value)