1 @node Data File Format, q2c Input Format, Portable File Format, Top
2 @appendix Data File Format
4 PSPP necessarily uses the same format for system files as do the
5 products with which it is compatible. This chapter is a description of
8 There are three data types used in system files: 32-bit integers, 64-bit
9 floating points, and 1-byte characters. In this document these will
10 simply be referred to as @code{int32}, @code{flt64}, and @code{char},
11 the names that are used in the PSPP source code. Every field of type
12 @code{int32} or @code{flt64} is aligned on a 32-bit boundary relative to
13 the start of the record.
15 The endianness of data in PSPP system files is not specified. System
16 files output on a computer of a particular endianness will have the
17 endianness of that computer. However, PSPP can read files of either
18 endianness, regardless of its host computer's endianness. PSPP
19 translates endianness for both integer and floating point numbers.
21 Floating point formats are also not specified. PSPP does not
22 translate between floating point formats. This is unlikely to be a
23 problem as all modern computer architectures use IEEE 754 format for
24 floating point representation.
26 The PSPP system-missing value is represented by the largest possible
27 negative number in the floating point format; in C, this is most likely
28 @code{-DBL_MAX}. There are two other important values used in missing
29 values: @code{HIGHEST} and @code{LOWEST}. These are represented by the
30 largest possible positive number (probably @code{DBL_MAX}) and the
31 second-largest negative number. The latter must be determined in a
32 system-dependent manner; in IEEE 754 format it is represented by value
33 @code{0xffeffffffffffffe}.
35 System files are divided into records. Each record begins with an
36 @code{int32} giving a numeric record type. Individual record types are
40 * File Header Record::
42 * Value Label Record::
43 * Value Label Variable Record::
45 * Machine int32 Info Record::
46 * Machine flt64 Info Record::
47 * Auxiliary Variable Parameter Record::
48 * Long Variable Names Record::
49 * Very Long String Length Record::
50 * Miscellaneous Informational Records::
51 * Dictionary Termination Record::
55 @node File Header Record, Variable Record, Data File Format, Data File Format
56 @section File Header Record
58 The file header is always the first record in the file.
66 int32 nominal_case_size;
71 char creation_date[9];
72 char creation_time[8];
79 @item char rec_type[4];
80 Record type code. Always set to @samp{$FL2}. This is the only record
81 for which the record type is not of type @code{int32}.
83 @item char prod_name[60];
84 Product identification string. This always begins with the characters
85 @samp{@@(#) SPSS DATA FILE}. PSPP uses the remaining characters to
86 give its version and the operating system name; for example, @samp{GNU
87 pspp 0.1.4 - sparc-sun-solaris2.5.2}. The string is truncated if it
88 would be longer than 60 characters; otherwise it is padded on the right
91 @item int32 layout_code;
92 Always set to 2. PSPP reads this value to determine the
95 @item int32 nominal_case_size;
96 Number of data elements per case. This is the number of variables,
97 except that long string variables add extra data elements (one for every
98 8 characters after the first 8). However, string variables do not
99 contribute to this value beyond the first 255 bytes. Further, system
100 files written by some systems set this value to -1. In general, it is
101 unsafe for systems reading system files to rely upon this value.
103 @item int32 compressed;
104 Set to 1 if the data in the file is compressed, 0 otherwise.
106 @item int32 weight_index;
107 If one of the variables in the data set is used as a weighting variable,
108 set to the index of that variable. Otherwise, set to 0.
111 Set to the number of cases in the file if it is known, or -1 otherwise.
113 In the general case it is not possible to determine the number of cases
114 that will be output to a system file at the time that the header is
115 written. The way that this is dealt with is by writing the entire
116 system file, including the header, then seeking back to the beginning of
117 the file and writing just the @code{ncases} field. For `files' in which
118 this is not valid, the seek operation fails. In this case,
119 @code{ncases} remains -1.
122 Compression bias. Always set to 100. The significance of this value is
123 that only numbers between @code{(1 - bias)} and @code{(251 - bias)} can
126 @item char creation_date[9];
127 Set to the date of creation of the system file, in @samp{dd mmm yy}
128 format, with the month as standard English abbreviations, using an
129 initial capital letter and following with lowercase. If the date is not
130 available then this field is arbitrarily set to @samp{01 Jan 70}.
132 @item char creation_time[8];
133 Set to the time of creation of the system file, in @samp{hh:mm:ss}
134 format and using 24-hour time. If the time is not available then this
135 field is arbitrarily set to @samp{00:00:00}.
137 @item char file_label[64];
138 Set the the file label declared by the user, if any (@pxref{FILE LABEL}).
139 Padded on the right with spaces.
141 @item char padding[3];
142 Ignored padding bytes to make the structure a multiple of 32 bits in
143 length. Set to zeros.
146 @node Variable Record, Value Label Record, File Header Record, Data File Format
147 @section Variable Record
149 Immediately following the header must come the variable records. There
150 must be one variable record for every variable and every 8 characters in
151 a long string beyond the first 8.
154 struct sysfile_variable
159 int32 n_missing_values;
164 /* The following two fields are present
165 only if has_var_label is 1. */
167 char label[/* variable length */];
169 /* The following field is present only
170 if n_missing_values is not 0. */
171 flt64 missing_values[/* variable length */];
176 @item int32 rec_type;
177 Record type code. Always set to 2.
180 Variable type code. Set to 0 for a numeric variable. For a short
181 string variable or the first part of a long string variable, this is set
182 to the width of the string. For the second and subsequent parts of a
183 long string variable, set to -1, and the remaining fields in the
184 structure are ignored.
186 @item int32 has_var_label;
187 If this variable has a variable label, set to 1; otherwise, set to 0.
189 @item int32 n_missing_values;
190 If the variable has no missing values, set to 0. If the variable has
191 one, two, or three discrete missing values, set to 1, 2, or 3,
192 respectively. If the variable has a range for missing variables, set to
193 -2; if the variable has a range for missing variables plus a single
194 discrete value, set to -3.
197 Print format for this variable. See below.
200 Write format for this variable. See below.
203 Variable name. The variable name must begin with a capital letter or
204 the at-sign (@samp{@@}). Subsequent characters may also be octothorpes
205 (@samp{#}), dollar signs (@samp{$}), underscores (@samp{_}), or full
206 stops (@samp{.}). The variable name is padded on the right with spaces.
208 @item int32 label_len;
209 This field is present only if @code{has_var_label} is set to 1. It is
210 set to the length, in characters, of the variable label, which must be a
211 number between 0 and 120.
213 @item char label[/* variable length */];
214 This field is present only if @code{has_var_label} is set to 1. It has
215 length @code{label_len}, rounded up to the nearest multiple of 32 bits.
216 The first @code{label_len} characters are the variable's variable label.
218 @item flt64 missing_values[/* variable length */];
219 This field is present only if @code{n_missing_values} is not 0. It has
220 the same number of elements as the absolute value of
221 @code{n_missing_values}. For discrete missing values, each element
222 represents one missing value. When a range is present, the first
223 element denotes the minimum value in the range, and the second element
224 denotes the maximum value in the range. When a range plus a value are
225 present, the third element denotes the additional discrete missing
226 value. HIGHEST and LOWEST are indicated as described in the chapter
230 The @code{print} and @code{write} members of sysfile_variable are output
231 formats coded into @code{int32} types. The LSB (least-significant byte)
232 of the @code{int32} represents the number of decimal places, and the
233 next two bytes in order of increasing significance represent field width
234 and format type, respectively. The MSB (most-significant byte) is not
235 used and should be set to zero.
237 Format types are defined as follows:
321 @node Value Label Record, Value Label Variable Record, Variable Record, Data File Format
322 @section Value Label Record
324 Value label records must follow the variable records and must precede
325 the header termination record. Other than this, they may appear
326 anywhere in the system file. Every value label record must be
327 immediately followed by a label variable record, described below.
329 Value label records begin with @code{rec_type}, an @code{int32} value
330 set to the record type of 3. This is followed by @code{count}, an
331 @code{int32} value set to the number of value labels present in this
334 These two fields are followed by a series of @code{count} tuples. Each
335 tuple is divided into two fields, the value and the label. The first of
336 these, the value, is composed of a 64-bit value, which is either a
337 @code{flt64} value or up to 8 characters (padded on the right to 8
338 bytes) denoting a short string value. Whether the value is a
339 @code{flt64} or a character string is not defined inside the value label
342 The second field in the tuple, the label, has variable length. The
343 first @code{char} is a count of the number of characters in the value
344 label. The remainder of the field is the label itself. The field is
345 padded on the right to a multiple of 64 bits in length.
347 @node Value Label Variable Record, Document Record, Value Label Record, Data File Format
348 @section Value Label Variable Record
350 Every value label variable record must be immediately preceded by a
351 value label record, described above.
354 struct sysfile_value_label_variable
358 int32 vars[/* variable length */];
363 @item int32 rec_type;
364 Record type. Always set to 4.
367 Number of variables that the associated value labels from the value
368 label record are to be applied.
370 @item int32 vars[/* variable length */];
371 A list of variables to which to apply the value labels. There are
372 @code{count} elements.
375 @node Document Record, Machine int32 Info Record, Value Label Variable Record, Data File Format
376 @section Document Record
378 There must be no more than one document record per system file.
379 Document records must follow the variable records and precede the
380 dictionary termination record.
383 struct sysfile_document
387 char lines[/* variable length */][80];
392 @item int32 rec_type;
393 Record type. Always set to 6.
396 Number of lines of documents present.
398 @item char lines[/* variable length */][80];
399 Document lines. The number of elements is defined by @code{n_lines}.
400 Lines shorter than 80 characters are padded on the right with spaces.
403 @node Machine int32 Info Record, Machine flt64 Info Record, Document Record, Data File Format
404 @section Machine @code{int32} Info Record
406 There must be no more than one machine @code{int32} info record per
407 system file. Machine @code{int32} info records must follow the variable
408 records and precede the dictionary termination record.
411 struct sysfile_machine_int32_info
422 int32 version_revision;
424 int32 floating_point_rep;
425 int32 compression_code;
427 int32 character_code;
432 @item int32 rec_type;
433 Record type. Always set to 7.
436 Record subtype. Always set to 3.
439 Size of each piece of data in the data part, in bytes. Always set to 4.
442 Number of pieces of data in the data part. Always set to 8.
444 @item int32 version_major;
445 PSPP major version number. In version @var{x}.@var{y}.@var{z}, this
448 @item int32 version_minor;
449 PSPP minor version number. In version @var{x}.@var{y}.@var{z}, this
452 @item int32 version_revision;
453 PSPP version revision number. In version @var{x}.@var{y}.@var{z},
456 @item int32 machine_code;
457 Machine code. PSPP always set this field to value to -1, but other
460 @item int32 floating_point_rep;
461 Floating point representation code. For IEEE 754 systems this is 1.
462 IBM 370 sets this to 2, and DEC VAX E to 3.
464 @item int32 compression_code;
465 Compression code. Always set to 1.
467 @item int32 endianness;
468 Machine endianness. 1 indicates big-endian, 2 indicates little-endian.
470 @item int32 character_code;
471 Character code. 1 indicates EBCDIC, 2 indicates 7-bit ASCII, 3
472 indicates 8-bit ASCII, 4 indicates DEC Kanji.
475 @node Machine flt64 Info Record, Auxiliary Variable Parameter Record, Machine int32 Info Record, Data File Format
476 @section Machine @code{flt64} Info Record
478 There must be no more than one machine @code{flt64} info record per
479 system file. Machine @code{flt64} info records must follow the variable
480 records and precede the dictionary termination record.
483 struct sysfile_machine_flt64_info
499 @item int32 rec_type;
500 Record type. Always set to 7.
503 Record subtype. Always set to 4.
506 Size of each piece of data in the data part, in bytes. Always set to 4.
509 Number of pieces of data in the data part. Always set to 3.
512 The system missing value.
515 The value used for HIGHEST in missing values.
518 The value used for LOWEST in missing values.
521 @node Auxiliary Variable Parameter Record, Long Variable Names Record, Machine flt64 Info Record, Data File Format
522 @section Auxiliary Variable Parameter Record
524 There must be no more than one auxiliary variable parameter record per
525 system file. This record must follow the variable
526 records and precede the dictionary termination record.
529 struct sysfile_aux_var_parameter
538 struct aux_params aux_params[/* variable length */];
543 @item int32 rec_type;
544 Record type. Always set to 7.
547 Record subtype. Always set to 11.
550 The size @code{int32}. Always set to 4.
553 The total number of records in @code{aux_params}, multiplied by 3.
555 @item struct aux_params aux_params[];
556 An array of @code{struct aux_params}. The order of the elements corresponds
557 to the order of the variables in the Variable Records. The @code{struct aux_params} type is defined as follows:
570 The measurement type of the variable:
581 The width of the display column for the variable in characters.
583 @item int32 alignment
584 The alignment of the variable for display purposes:
603 @node Long Variable Names Record, Very Long String Length Record, Auxiliary Variable Parameter Record, Data File Format
604 @section Long Variable Names Record
606 There must be no more than one long variable names record per
607 system file. This record must follow the variable
608 records and precede the dictionary termination record.
611 struct sysfile_long_variable_names
620 char var_name_pairs[/* variable length */];
625 @item int32 rec_type;
626 Record type. Always set to 7.
629 Record subtype. Always set to 13.
632 The size of each element in the @code{var_name_pairs} member. Always set to 1.
635 The total number of bytes in @code{var_name_pairs}.
637 @item char var_name_pairs[/* variable length */];
638 A list of @var{key}--@var{value} tuples, where @var{key} is the name
639 of a variable, and @var{value} is its long variable name.
640 The @var{key} field is at most 8 bytes long and must match the
641 name of a variable which appears in the variable record (@pxref{Variable
643 The @var{value} field is at most 64 bytes long.
644 The @var{key} and @var{value} fields are separated by a @samp{=} byte.
645 Each tuple is separated by a byte whose value is 09. There is no
646 trailing separator following the last tuple.
647 The total length is @code{count} bytes.
650 @node Very Long String Length Record, Miscellaneous Informational Records, Long Variable Names Record, Data File Format
651 @comment node-name, next, previous, up
652 @section Very Long String Length Record
655 There must be no more than one very long string length record per
656 system file. This record must follow the variable records and precede the
657 dictionary termination record.
660 struct sysfile_very_long_string_lengths
669 char string_lengths[/* variable length */];
674 @item int32 rec_type;
675 Record type. Always set to 7.
678 Record subtype. Always set to 14.
681 The size of each element in the @code{string_lengths} member. Always set to 1.
684 The total number of bytes in @code{string_lengths}.
686 @item char string_lengths[/* variable length */];
687 A list of @var{key}--@var{value} tuples, where @var{key} is the name
688 of a variable, and @var{value} is its length.
689 The @var{key} field is at most 8 bytes long and must match the
690 name of a variable which appears in the variable record (@pxref{Variable
692 The @var{value} field is exactly 5 bytes long. It is a zero-padded,
693 ASCII-encoded string that is the length of the variable.
694 The @var{key} and @var{value} fields are separated by a @samp{=} byte.
695 Tuples are delimited by a two-byte sequence @{00, 09@}.
696 After the last tuple, there may be a single byte 00, or @{00, 09@}.
697 The total length is @code{count} bytes.
702 @node Miscellaneous Informational Records, Dictionary Termination Record, Very Long String Length Record, Data File Format
703 @section Miscellaneous Informational Records
705 Miscellaneous informational records must follow the variable records and
706 precede the dictionary termination record.
708 Miscellaneous informational records are ignored by PSPP when reading
709 system files. They are not written by PSPP when writing system files.
712 struct sysfile_misc_info
721 char data[/* variable length */];
726 @item int32 rec_type;
727 Record type. Always set to 7.
730 Record subtype. May take any value. According to Aapi
731 H@"am@"al@"ainen, value 5 indicates a set of grouped variables and 6
732 indicates date info (probably related to USE).
735 Size of each piece of data in the data part. Should have the value 4 or
736 8, for @code{int32} and @code{flt64}, respectively.
739 Number of pieces of data in the data part.
741 @item char data[/* variable length */];
742 Arbitrary data. There must be @code{size} times @code{count} bytes of
746 @node Dictionary Termination Record, Data Record, Miscellaneous Informational Records, Data File Format
747 @section Dictionary Termination Record
749 The dictionary termination record must follow all other records, except
750 for the actual cases, which it must precede. There must be exactly one
751 dictionary termination record in every system file.
754 struct sysfile_dict_term
762 @item int32 rec_type;
763 Record type. Always set to 999.
766 Ignored padding. Should be set to 0.
769 @node Data Record, , Dictionary Termination Record, Data File Format
772 Data records must follow all other records in the data file. There must
773 be at least one data record in every system file.
775 The format of data records varies depending on whether the data is
776 compressed. Regardless, the data is arranged in a series of 8-byte
779 When data is not compressed,
780 each element corresponds to
781 the variable declared in the respective variable record (@pxref{Variable
782 Record}). Numeric values are given in @code{flt64} format; string
783 values are literal characters string, padded on the right when
786 Compressed data is arranged in the following manner: the first 8-byte
787 element in the data section is divided into a series of 1-byte command
788 codes. These codes have meanings as described below:
792 Ignored. If the program writing the system file accumulates compressed
793 data in blocks of fixed length, 0 bytes can be used to pad out extra
794 bytes remaining at the end of a fixed-size block.
797 These values indicate that the corresponding numeric variable has the
798 value @code{(@var{code} - @var{bias})} for the case being read, where
799 @var{code} is the value of the compression code and @var{bias} is the
800 variable @code{compression_bias} from the file header. For example,
801 code 105 with bias 100.0 (the normal value) indicates a numeric variable
805 End of file. This code may or may not appear at the end of the data
806 stream. PSPP always outputs this code but its use is not required.
809 This value indicates that the numeric or string value is not
810 compressible. The value is stored in the 8-byte element following the
811 current block of command bytes. If this value appears twice in a block
812 of command bytes, then it indicates the second element following the
813 command bytes, and so on.
816 Used to indicate a string value that is all spaces.
819 Used to indicate the system-missing value.
822 When the end of the first 8-byte element of command bytes is reached,
823 any blocks of non-compressible values are skipped, and the next element
824 of command bytes is read and interpreted, until the end of the file is