On Tue, Aug 22, 2006 at 08:59:40AM -0700, Daan Leijen wrote: > > > 2. I am looking for a parser, but I don't know Haskell parsers. Is > > > Parsec a good choice? > > > > Parsec is definitely a good choice, but beware that it parses the whole > > input before returning, thus it may consume a huge batch of memory. As > > CSV is a line oriented format, you should make your parser lazy. Search > > the mailing list archive for "lazy parser". > > A good trick here is to first use "lines" to break up the input into > lines and than map a Parsec parse for each line to those lines > (returning a list of Maybe a or ParseError a results).
You can also create a lazy "many" parser using (get|set)ParserState. The benefit is that this will also work if your elements are not in one-to-one relation with lines and that it automatically takes care of maintaining position in the input (for error messages). lazyMany :: GenParser Char () a -> SourceName -> [Char] -> [a] lazyMany p file contents = lm state0 where Right state0 = parse getParserState file contents lm state = case parse p' "" "" of Left err -> error (show err) Right x -> x where p' = do setParserState state choice [ do eof return [] , do x <- p state' <- getParserState return (x : lm state') ] Best regards Tomasz _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe