csv: Make the character used for quoting configurable. 100/pspp 101/pspp 102/pspp 103/pspp 20101106040501/pspp 20101107040502/pspp 20101108040501/pspp 20101109040501/pspp 20101110040502/pspp 20101111040502/pspp 20101112040502/pspp 20101113040502/pspp 20101114040508/pspp
authorBen Pfaff <blp@cs.stanford.edu>
Sat, 6 Nov 2010 04:20:55 +0000 (21:20 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Sat, 6 Nov 2010 04:20:55 +0000 (21:20 -0700)
Requested by Björn Manke <bjoernmanke@gmx.net>.

doc/invoking.texi
src/output/csv.c

index 82d8a5ed4dfa075b41d79127839369decfc9efad..826498a26ce54ac6a90d5e462c3089d2b165d68c 100644 (file)
@@ -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
index d168fd9534140230f2e4fb9c15646aa779c0a7e2..c8619a9a7d403ebc84ebc55d9c307976a49b734b 100644 (file)
@@ -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);