From: Ben Pfaff Date: Sat, 6 Nov 2010 04:20:55 +0000 (-0700) Subject: csv: Make the character used for quoting configurable. X-Git-Tag: v0.7.7~140 X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=08d746bc7c18614ce0b2d57a414441de6e58fa00;p=pspp-builds.git csv: Make the character used for quoting configurable. Requested by Björn Manke . --- diff --git a/doc/invoking.texi b/doc/invoking.texi index 82d8a5ed..826498a2 100644 --- a/doc/invoking.texi +++ b/doc/invoking.texi @@ -382,6 +382,14 @@ given on @option{-o} does not end in @file{.csv}. Sets the character used to separate fields. Default: a comma (@samp{,}). +@item -O quote=@var{qualifier} +Sets @var{qualifier} as the character used to quote fields that +contain white space, the separator (or any of the characters in the +separator, if it contains more than one character), or the quote +character itself. If @var{qualifier} is longer than one character, +only the first character is used; if @var{qualifier} is the empty +string, then fields are never quoted. + @item -O captions=@var{boolean} Whether table captions should be printed. Default: @code{on}. @end table diff --git a/src/output/csv.c b/src/output/csv.c index d168fd95..c8619a9a 100644 --- a/src/output/csv.c +++ b/src/output/csv.c @@ -44,6 +44,7 @@ struct csv_driver struct output_driver driver; char *separator; /* Field separator (usually comma or tab). */ + int quote; /* Quote character (usually ' or ") or 0. */ char *quote_set; /* Characters that force quoting. */ bool captions; /* Print table captions? */ @@ -75,13 +76,17 @@ csv_create (const char *file_name, enum settings_output_devices device_type, { struct output_driver *d; struct csv_driver *csv; + char *quote; csv = xzalloc (sizeof *csv); d = &csv->driver; output_driver_init (&csv->driver, &csv_driver_class, file_name, device_type); csv->separator = parse_string (opt (d, o, "separator", ",")); - csv->quote_set = xasprintf ("\"\n\r\t%s", csv->separator); + quote = parse_string (opt (d, o, "quote", "\"")); + csv->quote = quote[0]; + free (quote); + csv->quote_set = xasprintf ("\n\r\t%s%c", csv->separator, csv->quote); csv->captions = parse_boolean (opt (d, o, "captions", "true")); csv->file_name = xstrdup (file_name); csv->file = fn_open (csv->file_name, "w"); @@ -125,18 +130,18 @@ csv_output_field (struct csv_driver *csv, const char *field) while (*field == ' ') field++; - if (field[strcspn (field, csv->quote_set)]) + if (csv->quote && field[strcspn (field, csv->quote_set)]) { const char *p; - putc ('"', csv->file); + putc (csv->quote, csv->file); for (p = field; *p != '\0'; p++) { - if (*p == '"') - putc ('"', csv->file); + if (*p == csv->quote) + putc (csv->quote, csv->file); putc (*p, csv->file); } - putc ('"', csv->file); + putc (csv->quote, csv->file); } else fputs (field, csv->file);