Wiki
Download
Manual
Eggs
API
Tests
Bugs
show
edit
history
You can edit this page using
wiki syntax
for markup.
Article contents:
== Outdated egg! This is an egg for CHICKEN 4, the unsupported old release. You're almost certainly looking for [[/eggref/5/csv|the CHICKEN 5 version of this egg]], if it exists. If it does not exist, there may be equivalent functionality provided by another egg; have a look at the [[https://wiki.call-cc.org/chicken-projects/egg-index-5.html|egg index]]. Otherwise, please consider porting this egg to the current version of CHICKEN. [[tags: eggs]] [[toc:]] == csv === Description The {{csv}} library contains procedures for parsing and formatting of comma-separated values (CSV) as described in [[http://tools.ietf.org/html/rfc4180|RFC 4180]]. There are several differences with the RFC: * The RFC prescribes CRLF standard network line breaks, but many CSV files have platform-dependent line endings, so this library accepts any sequence of CRs and LFs as a line break. * The format of header lines is exactly like a regular record and the presence of a header can only be determined from the mime type. This library treats all lines as regular records. * 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. This library allow all characters in fields, except for the field delimiter character, CRs and LFs in unquoted fields. * According to the RFC, the records all have to have the same length. This library allows variable length records. * The delimiter character is specified by the user and can be a character other than comma, or an SRFI-14 character set. See also [[csv-xml]]. === Library Procedures <procedure>(csv-record? X) => BOOL</procedure><br> Returns {{#t}} if the given object is a {{csv-record}}, {{#f}} otherwise. <procedure>(list->csv-record LIST) => CSV-RECORD</procedure><br> Takes in a list of values and creates a {{csv-record}} object. <procedure>(csv-record->list CSV-RECORD) => LIST</procedure><br> Returns the list of values contained in the given {{csv-record}} object. ==== Parsing Procedures: Preliminaries The parsing procedures in {{csv}} come in two flavors: generic and specialized for operations on lists of characters and strings. The {{<CSV>}} typeclass defined in module {{csv}} is intended to provide abstraction over different kinds of input sequences, e.g. character lists, strings, streams, etc. {{<CSV>}} inherits from {{<CoreABNF>}}, which provides the core parsing primitives used to build the CSV grammar parser (see the [[abnf]] library for more information). The procedures in modules {{csv-char-list}} and {{csv-string}} operate on lists of characters and strings, respectively. They do not require the instantiaton of type classes and are meant to provide "turn key" parsing. ==== Parsing Procedures: {{csv-char-list}} <procedure>(csv-parser [DELIMITER]) => PARSER</procedure><br> When invoked, {{csv-parser}} returns a parser procedure takes in a list of characters and returns a list of the form: ((<#csv-record (FIELD1 FIELD2 ...)>) (<#csv-record ... >)) where {{FIELD}} represents the field values in a record. Optional arguments {{DELIMITER}} is the field delimiter character, if other than comma. ==== Parsing Procedures: {{csv-string}} <procedure>(csv-parser [DELIMITER]) => PARSER</procedure><br> When invoked, {{csv-parser}} returns a parser procedure takes in a string and returns a list of the form: ((<#csv-record (FIELD1 FIELD2 ...)>) (<#csv-record ... >)) where {{FIELD}} represents the field values in a record. Optional arguments {{DELIMITER}} is the field delimiter character, if other than comma. ==== Parsing Procedures: {{csv}} <procedure>(make-parser CSV-INSTANCE) => (LAMBDA [DELIMITER]) => PARSER</procedure><br> Once applied to an instance of the {{<CSV>}} typeclass, {{make-parser}} returns a constructor for the CSV parsing procedure. Optional argument {{DELIMITER}} specifies the field delimiter (comma by default). {{DELIMITER}} can be a character, or an SRFI-14 character set. The returned procedure takes in an input stream and returns a list of the form: ((<#csv-record (FIELD1 FIELD2 ...)>) (<#csv-record ... >)) where {{FIELD}} represents the field values in a record. The following example illustrates the creation of an instance of {{<CSV>}} specialized for character lists. <enscript highlight="scheme"> (require-extension typeclass input-classes abnf csv) (define char-list-<Input> (make-<Input> null? car cdr)) (define char-list-<Token> (Input->Token char-list-<Input>)) (define char-list-<CharLex> (Token->CharLex char-list-<Token>)) (define char-list-<CoreABNF> (CharLex->CoreABNF char-list-<CharLex>)) (define char-list-<CSV> (CoreABNF->CSV char-list-<CoreABNF> )) (define parse-csv ((make-parser char-list-<CSV>) #\|)) (parse-csv (string->list "a|b|c")) (map csv-record->list (parse-csv (string->list "a|b|c"))) ==> (("a" "b" "c")) </enscript> ==== Formatting procedures <procedure>(make-format [DELIMITER]) => FORMAT-CELL * FORMAT-RECORD * FORMAT-CSV</procedure><br> Returns procedures for outputting individual field values, CSV records, and lists of CSV records, where each list is printed on a separate line. Procedure {{FORMAT-CELL}} takes in a value, obtains its string representation via {{format}}, and surrounds the string with quotes, if it contains characters that need to be escaped (such as quote characters, the delimiter character, or newlines). Procedure {{FORMAT-RECORD}} takes in a record of type {{csv-record}} and returns its string representation, based on the strings produced by {{FORMAT-CELL}} and the delimiter character. Procedure {{FORMAT-CSV}} takes in a list of {{csv-record}} objects and produces a string representation using {{FORMAT-RECORD}}. Example: <enscript highlight="scheme"> (use csv) (define-values (fmt-cell fmt-record fmt-csv) (make-format ";")) (fmt-cell "hello") => "hello" ;; This is quoted because it contains delimiter-characters (fmt-cell "one;two;three") => "\"one;two;three\"" ;; This is quoted because it contains quotes, which are then doubled for escaping (fmt-cell "say \"hi\"") => "\"say \"\"hi\"\"\"" ;; Converts one line at a time (useful when converting data in a streaming manner) (fmt-record (list->csv-record '("hi there" "let's say \"hello world\" again" "until we are bored"))) => "hi there;\"let's say \"\"hello world\"\" again\";until we are bored" ;; And an example of how to quickly convert a list of lists ;; to a CSV string containing the entire CSV file (fmt-csv (map list->csv-record '(("one" "two") ("and another \"line\"" "of csv stuff")))) => "one;two\r\n\"and another \"\"line\"\"\";of csv stuff\r\n" </enscript> === Requires * [[abnf]] * [[typeclass]] === Version History * 5.3 Added module csv-char-list * 5.1 utf8-related bug fixes * 5.0 Compatibility with abnf 6.0 / using utf8 for char operations * 4.7 Created module csv-string * 4.6 Ensure unit test script returns proper exit code * 4.5 Compatibility with CharLex->CoreABNF constructor in abnf * 4.4 Added cr and lf to set of characters allows in escaped strings * 4.3 Added csv-record? to list of exported identifiers * 4.1 Fixes in the handling of escaped strings * 4.0 Compatibility with abnf 5 * 3.2 Fixes to reflect changes in the regex API in Chicken 4.6.0 * 3.1 Added regex as an explicit dependency * 3.0 Implemented typeclass interface * 2.0 Added formatting routines * 1.0 Initial Release === License Copyright 2009-2013 Ivan Raikov and the Okinawa Institute of Science and Technology. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. A full copy of the GPL license can be found at <http://www.gnu.org/licenses/>.
Description of your changes:
I would like to authenticate
Authentication
Username:
Password:
Spam control
What do you get when you subtract 19 from 5?