astview-0.1: data/CsvParser.hs
module CsvParser where
-- container
import Data.Tree (Tree(Node,rootLabel))
-- syb
import Data.Generics (Data)
-- base
import Unsafe.Coerce (unsafeCoerce)
-- local imports
import Language.Astview.Parser as Astview
import Language.Astview.DataTree
-- Parsec (CSV Parser)
import Text.ParserCombinators.Parsec as Parsec
import Data.Generics hiding (Infix)
import Text.ParserCombinators.Parsec
import qualified Text.ParserCombinators.Parsec.Token as P
import Text.ParserCombinators.Parsec.Language (javaStyle)
import Text.ParserCombinators.Parsec.Expr
csv = Parser "CSV" ["*.csv"] buildTreeCSV
-- CSV
buildTreeCSV :: String -> Tree String
buildTreeCSV s = case parseCSV s of
Right ast -> flat $ data2tree (ast::[[String]])
Left ParseError -> Node "ParseError" []
parseCSV :: (Data a) => String -> Either Astview.ParseError a
parseCSV s = case parseCSV' s of
Right p -> unsafeCoerce $ Right p
_ -> Left ParseError
-- Parsec (Simple CSV)
csvFile = endBy line eol
line = sepBy cell (char ',')
cell = many (noneOf ",\n")
eol = char '\n'
parseCSV' :: String -> Either Parsec.ParseError [[String]]
parseCSV' input = parse csvFile "(unknown)" input