-- | Simple CSV parser -- module Criterion.ToHtml.Csv ( Field , Record , Csv , parseCsv ) where type Field = String type Record = [Field] type Csv = [Record] -- | Parse a CSV file -- parseCsv :: String -> Csv parseCsv = map parseRecord . lines -- | Parse a CSV record -- parseRecord :: String -> Record parseRecord rec = case parseField rec of (x, ',' : y) -> x : parseRecord y (x, _) -> [x] -- | Parse a CSV field -- parseField :: String -> (Field, String) parseField xs = case xs of ('"' : xs') -> parse' "" xs' _ -> break (== ',') xs where parse' y ('"' : '"' : ys) = parse' ('"' : y) ys parse' y ('"' : ys) = (reverse y, ys) parse' y (y' : ys) = parse' (y' : y) ys parse' y [] = (reverse y, "")