HaskellでCSV

ふつけるを読み終わったので、記念にCSVパーザを書いてみた。
どう書く?.orgに投稿されているのより、ちょっと長めですね。

module CSVParser where

import Text.ParserCombinators.Parsec

csv_lines :: Parser [[String]]
csv_lines = do lines <- line `sepBy` (skipMany1 $ char '\n')
               eof
               return lines

line   :: Parser [String]
line   =  do  cls <- column `sepBy1` (char ',')
              return  cls

last_column :: Parser String
last_column = do  cl <- column 
                  char '\n'
                  return cl

column :: Parser String
column =  do c1 <- try(quoted)
             return c1
      <|> do c2 <- many $ noneOf ",\n"
             return c2

quoted :: Parser String
quoted =  do char '"'
             cs <- many quoted_char
             char '"'
             return cs

quoted_char :: Parser Char
quoted_char =  do try (string "\"\"" )
                  return '\"'
           <|> do c <- noneOf "\""
                  return c