-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | CSV loader and dumper -- -- CSV loader and dumper -- -- This library parses and dumps documents that are formatted according -- to RFC 4180, "The common Format and MIME Type for Comma-Separated -- Values (CSV) Files". This format is used, among many other things, as -- a lingua franca for spreadsheets, and for certain web services. @package csv @version 0.1.2 -- | This module parses and dumps documents that are formatted more or less -- according to RFC 4180, "Common Format and MIME Type for -- Comma-Separated Values (CSV) Files", -- http://www.rfc-editor.org/rfc/rfc4180.txt. -- -- There are some issues with this RFC. I will describe what these issues -- are and how I deal with them. -- -- First, the RFC prescribes CRLF standard network line breaks, but you -- are likely to run across CSV files with other line endings, so we -- accept any sequence of CRs and LFs as a line break. -- -- Second, there is an optional header line, but the format for the -- header line is exactly like a regular record and you can only figure -- out whether it exists from the mime type, which may not be available. -- I ignore the issues of header lines and simply turn them into regular -- records. -- -- Third, there is an inconsistency, in that the formal grammar specifies -- that fields can contain only certain US ASCII characters, but the -- specification of the MIME type allows for other character sets. I will -- allow all characters in fields, except for commas, CRs and LFs in -- unquoted fields. This should make it possible to parse CSV files in -- any encoding, but it allows for characters such as tabs that the RFC -- may be interpreted to forbid even in non-US-ASCII character sets. -- -- NOTE: Several people have asked me to implement extensions that are -- used in non-US versions Microsoft Excel. This library implements -- RFC-compliant CSV, not Microsoft Excel CSV. If you want to write a -- library that deals with the CSV-like formats used by non-US versions -- of Excel or any other software, you should write a separate library. I -- suggest you call it Text.SSV, for Something Separated Values. module Text.CSV -- | A CSV file is a series of records. According to the RFC, the records -- all have to have the same length. As an extension, I allow variable -- length records. type CSV = [Record] -- | A record is a series of fields type Record = [Field] -- | A field is a string type Field = String -- | A Parsec parser for parsing CSV files csv :: Parser CSV -- | Given a file name (used only for error messages) and a string to -- parse, run the parser. parseCSV :: FilePath -> String -> Either ParseError CSV -- | Given a file name, read from that file and run the parser parseCSVFromFile :: FilePath -> IO (Either ParseError CSV) -- | Given a string, run the parser, and print the result on stdout. parseCSVTest :: String -> IO () -- | Given an object of type CSV, generate a CSV formatted string. Always -- uses escaped fields. printCSV :: CSV -> String