packages feed

csv-to-qif-0.3: src/Parser.hs

{-# LANGUAGE ScopedTypeVariables #-}
-----------------------------------------------------------------------------
--
-- Module      :  Parser
-- Copyright   :  (c) Ingolf Wagner
-- License     :  BSD3
--
-- Maintainer  :  Ingolf Wagner <palipalo9@googlemail.com>
-- Stability   :  unstable
-- Portability :
--
-- | This package should create a parser for csv files.
-- it's just a wrapper
--
-----------------------------------------------------------------------------

module Parser where

import Data.Char
import Data.Spreadsheet
import Control.Monad.Exception.Asynchronous.Lazy(Exceptional(..))
import Data.List
import System.IO.Error
import System.IO

import Qifer




type ParseError = String

-- | parse csv file to read transactions from it
parseCSVFromFile :: Int -> String -> Char -> IO (Either ParseError CSV)
parseCSVFromFile skip file separator = do
    firstContent <- readFile file
    let content           = unlines . separatorAtEndFix . drop skip . lines $ firstContent
        separatorAtEndFix = map (\l -> l ++ " ")
    case (fromString '\n' separator content) of
        Exceptional (Just s) result -> do
            hPutStrLn stderr s
            return $ Right $ strip result
        Exceptional Nothing result -> return $ Right $ strip result

strip :: CSV -> CSV
strip = map (\line -> map (\word -> stripWord word) line)
    where   stripWord     = dropWhile dontNeed . dropWhileEnd dontNeed
            dontNeed c    = (c == '"') || (isSpace c)