The implementation of fixed-format mode only allowed a format
type (e.g. DOLLAR) to be specified. SPSS also allowed a full
format specification (e.g. DOLLAR12.2), so this implements that
feature.
Reported-by: Ronaldo Baltar <ronaldo.baltar@gmail.com>
The VARIABLES subcommand, which is required, specifies the positions
at which each variable can be found. For each variable, specify its
name, followed by its start and end column separated by @samp{-}
The VARIABLES subcommand, which is required, specifies the positions
at which each variable can be found. For each variable, specify its
name, followed by its start and end column separated by @samp{-}
-(e.g.@: @samp{0-9}), followed by the input format type (e.g.@:
-@samp{F}). For this command, columns are numbered starting from 0 at
+(e.g.@: @samp{0-9}), followed by an input format type (e.g.@:
+@samp{F}) or a full format specification (e.g.@: @samp{DOLLAR12.2}).
+For this command, columns are numbered starting from 0 at
the left column. Introduce the variables in the second and later
lines of a case by a slash followed by the number of the line within
the case, e.g.@: @samp{/2} for the second line.
the left column. Introduce the variables in the second and later
lines of a case by a slash followed by the number of the line within
the case, e.g.@: @samp{/2} for the second line.
if (!parse_format_specifier (lexer, &input)
|| !fmt_check_input (&input))
goto error;
if (!parse_format_specifier (lexer, &input)
|| !fmt_check_input (&input))
goto error;
+
+ output = fmt_for_output_from_input (&input);
+ char fmt_type_name[FMT_TYPE_LEN_MAX + 1];
+ enum fmt_type fmt_type;
+ int w, d;
+
if (!parse_column_range (lexer, 0, &fc, &lc, NULL))
goto error;
if (!parse_column_range (lexer, 0, &fc, &lc, NULL))
goto error;
- if (!parse_format_specifier_name (lexer, &input.type))
+
+ /* Accept a format (e.g. F8.2) or just a type name (e.g. DOLLAR). */
+ if (!parse_abstract_format_specifier (lexer, fmt_type_name, &w, &d))
+ if (!fmt_from_name (fmt_type_name, &fmt_type))
+ {
+ msg (SE, _("Unknown format type `%s'."), fmt_type_name);
+ goto error;
+ }
+
+ /* Compose input format. */
+ input.type = fmt_type;
input.w = lc - fc + 1;
input.d = 0;
if (!fmt_check_input (&input))
goto error;
input.w = lc - fc + 1;
input.d = 0;
if (!fmt_check_input (&input))
goto error;
+
+ /* Compose output format. */
+ if (w != 0)
+ {
+ output.type = fmt_type;
+ output.w = w;
+ output.d = d;
+ if (!fmt_check_output (&output))
+ goto error;
+ }
+ else
+ output = fmt_for_output_from_input (&input);
- output = fmt_for_output_from_input (&input);
v = dict_create_var (dict, name, fmt_var_width (&input));
if (v == NULL)
v = dict_create_var (dict, name, fmt_var_width (&input));
if (v == NULL)
AT_SETUP([GET DATA /TYPE=TXT with multiple records per case])
AT_DATA([get-data.sps], [dnl
get data /type=txt /file=inline /arrangement=fixed /fixcase=3 /variables=
AT_SETUP([GET DATA /TYPE=TXT with multiple records per case])
AT_DATA([get-data.sps], [dnl
get data /type=txt /file=inline /arrangement=fixed /fixcase=3 /variables=
/2 end 0-19 adate
/3 count 0-2 f.
begin data.
/2 end 0-19 adate
/3 count 0-2 f.
begin data.
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Data List
start,end,count
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Data List
start,end,count
-07/22/2007,10/06/2007,321
-07/14/1789,08/26/1789,4
-01/01/1972,12/31/1999,682
+07/22/07,10/06/2007,321
+********,08/26/1789,4
+01/01/72,12/31/1999,682