1 dnl PSPP - a program for statistical analysis.
2 dnl Copyright (C) 2017 Free Software Foundation, Inc.
4 dnl This program is free software: you can redistribute it and/or modify
5 dnl it under the terms of the GNU General Public License as published by
6 dnl the Free Software Foundation, either version 3 of the License, or
7 dnl (at your option) any later version.
9 dnl This program is distributed in the hope that it will be useful,
10 dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
11 dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 dnl GNU General Public License for more details.
14 dnl You should have received a copy of the GNU General Public License
15 dnl along with this program. If not, see <http://www.gnu.org/licenses/>.
17 AT_BANNER([RECODE transformation])
19 m4_define([RECODE_SAMPLE_DATA],
20 [DATA LIST LIST NOTABLE/x (f1) s (a4) t (a10).
21 MISSING VALUES x(9)/s('xxx').
37 AT_SETUP([RECODE numeric to numeric, without INTO])
40 NUMERIC x0 TO x8 (F3).
41 MISSING VALUES x0 to x8 (9).
45 RECODE x1 (1=9)(3=8)(5=7).
47 RECODE x2 (1=8)(2,3,4,5,6,8=9)(9=1).
49 RECODE x3 (1 THRU 9=10)(MISSING=11).
51 RECODE x4 (MISSING=11)(1 THRU 9=10).
53 RECODE x5 (LOWEST THRU 5=1).
55 RECODE x6 (4 THRU HIGHEST=2).
57 RECODE x7 (LO THRU HI=3).
62 AT_CHECK([pspp -O format=csv recode.sps], [0],
64 x,x0,x1,x2,x3,x4,x5,x6,x7,x8
79 AT_SETUP([RECODE numeric to numeric, with INTO, without COPY])
82 NUMERIC ix0 TO ix8 (F3).
83 RECODE x (1=9) INTO ix0.
84 RECODE x (1=9)(3=8)(5=7) INTO ix1.
85 RECODE x (1=8)(2,3,4,5,6,8=9)(9=1) INTO ix2.
86 RECODE x (1 THRU 9=10)(MISSING=11) INTO ix3.
87 RECODE x (MISSING=11)(1 THRU 9=10) INTO ix4.
88 RECODE x (LOWEST THRU 5=1) INTO ix5.
89 RECODE x (4 THRU HIGHEST=2) INTO ix6.
90 RECODE x (LO THRU HI=3) INTO ix7.
91 RECODE x (SYSMIS=4) INTO ix8.
94 AT_CHECK([pspp -O format=csv recode.sps], [0],
96 x,ix0,ix1,ix2,ix3,ix4,ix5,ix6,ix7,ix8
100 3,.,8,9,10,10,1,.,3,.
101 4,.,.,9,10,10,1,2,3,.
102 5,.,7,9,10,10,1,2,3,.
103 6,.,.,9,10,10,.,2,3,.
104 7,.,.,.,10,10,.,2,3,.
105 8,.,.,9,10,10,.,2,3,.
106 9,.,.,1,10,11,.,2,3,.
107 .,.,.,.,11,11,.,.,.,4
111 AT_SETUP([RECODE numeric to numeric, with INTO, with COPY])
112 AT_DATA([recode.sps],
114 NUMERIC cx0 TO cx8 (F3).
115 RECODE x (1=9)(ELSE=COPY) INTO cx0.
116 RECODE x (1=9)(3=8)(5=7)(ELSE=COPY) INTO cx1.
117 RECODE x (1=8)(2,3,4,5,6,8=9)(9=1)(ELSE=COPY) INTO cx2.
118 RECODE x (1 THRU 9=10)(MISSING=11)(ELSE=COPY) INTO cx3.
119 RECODE x (MISSING=11)(1 THRU 9=10)(ELSE=COPY) INTO cx4.
120 RECODE x (LOWEST THRU 5=1)(ELSE=COPY) INTO cx5.
121 RECODE x (4 THRU HIGHEST=2)(ELSE=COPY) INTO cx6.
122 RECODE x (LO THRU HI=3)(ELSE=COPY) INTO cx7.
123 RECODE x (SYSMIS=4)(ELSE=COPY) INTO cx8.
124 RECODE x (5=COPY)(ELSE=22) INTO cx9.
127 AT_CHECK([pspp -O format=csv recode.sps], [0],
129 x,cx0,cx1,cx2,cx3,cx4,cx5,cx6,cx7,cx8,cx9
130 0,0,0,0,0,0,1,0,3,0,22.00
131 1,9,9,8,10,10,1,1,3,1,22.00
132 2,2,2,9,10,10,1,2,3,2,22.00
133 3,3,8,9,10,10,1,3,3,3,22.00
134 4,4,4,9,10,10,1,2,3,4,22.00
135 5,5,7,9,10,10,1,2,3,5,5.00
136 6,6,6,9,10,10,6,2,3,6,22.00
137 7,7,7,7,10,10,7,2,3,7,22.00
138 8,8,8,9,10,10,8,2,3,8,22.00
139 9,9,9,1,10,11,9,2,3,9,22.00
140 .,.,.,.,11,11,.,.,.,4,22.00
144 AT_SETUP([RECODE string to string, with INTO, without COPY])
145 AT_DATA([recode.sps],
147 STRING s0 TO s3 (A4)/t0 TO t3 (A10).
148 RECODE s t ('a'='b')('ab'='bc') INTO s0 t0.
149 RECODE s t ('abcd'='xyzw') INTO s1 t1.
150 RECODE s t ('abc'='def')(ELSE='xyz') INTO s2 t2.
151 RECODE t ('a'='b')('abcdefghi'='xyz')('abcdefghij'='jklmnopqr') INTO t3.
152 RECODE s (MISSING='gone') INTO s3.
153 LIST s t s0 TO s3 t0 TO t3.
155 AT_CHECK([pspp -O format=csv recode.sps], [0],
157 s,t,s0,s1,s2,s3,t0,t1,t2,t3
160 ab,ab,bc,,xyz,,bc,,xyz,
161 abc,abc,,,def,,,,def,
162 abcd,abcd,,xyzw,xyz,,,xyzw,xyz,
163 123,123,,,xyz,,,,xyz,
164 123,123,,,xyz,,,,xyz,
167 abcd,abcdefghi,,xyzw,xyz,,,,xyz,xyz
168 xxx,abcdefghij,,,xyz,gone,,,xyz,jklmnopqr
172 AT_SETUP(RECODE string to string, with INTO, with COPY])
173 AT_DATA([recode.sps],
175 STRING cs0 TO cs2 (A4)/ct0 TO ct3 (A10).
176 RECODE s t ('a'='b')('ab'='bc')(ELSE=COPY) INTO cs0 ct0.
177 RECODE s t ('abcd'='xyzw')(ELSE=COPY) INTO cs1 ct1.
178 RECODE s t ('abc'='def')(ELSE='xyz')(ELSE=COPY) INTO cs2 ct2.
179 RECODE t ('a'='b')('abcdefghi'='xyz')('abcdefghij'='jklmnopqr')(ELSE=COPY)
181 LIST s t cs0 TO cs2 ct0 TO ct3.
183 AT_CHECK([pspp -O format=csv recode.sps], [0],
185 s,t,cs0,cs1,cs2,ct0,ct1,ct2,ct3
187 a,a,b,a,xyz,b,a,xyz,b
188 ab,ab,bc,ab,xyz,bc,ab,xyz,ab
189 abc,abc,abc,abc,def,abc,abc,def,abc
190 abcd,abcd,abcd,xyzw,xyz,abcd,xyzw,xyz,abcd
191 123,123,123,123,xyz,123,123,xyz,123
192 123,123,123,123,xyz,123,123,xyz,123
193 +1,+1,+1,+1,xyz,+1,+1,xyz,+1
194 1x,1x,1x,1x,xyz,1x,1x,xyz,1x
195 abcd,abcdefghi,abcd,xyzw,xyz,abcdefghi,abcdefghi,xyz,xyz
196 xxx,abcdefghij,xxx,xxx,xyz,abcdefghij,abcdefghij,xyz,jklmnopqr
200 AT_SETUP([RECODE string to numeric])
201 AT_DATA([recode.sps],
203 NUMERIC ns0 TO ns2 (F3)/nt0 TO nt2 (F3).
204 RECODE s t (CONVERT)(' '=0)('abcd'=1) INTO ns0 nt0.
205 RECODE s t (' '=0)(CONVERT)('abcd'=1) INTO ns1 nt1.
206 RECODE s t ('1x'=1)('abcd'=2)(ELSE=3) INTO ns2 nt2.
207 LIST s t ns0 TO ns2 nt0 TO nt2.
209 AT_CHECK([pspp -O format=csv recode.sps], [0],
211 s,t,ns0,ns1,ns2,nt0,nt1,nt2
216 abcd,abcd,1,1,2,1,1,2
217 123,123,123,123,3,123,123,3
218 123,123,123,123,3,123,123,3
221 abcd,abcdefghi,1,1,2,.,.,3
222 xxx,abcdefghij,.,.,3,.,.,3
226 AT_SETUP([RECODE numeric to string])
227 AT_DATA([recode.sps],
229 STRING sx0 TO sx2 (a10).
230 RECODE x (1 THRU 9='abcdefghij') INTO sx0.
231 RECODE x (0,1,3,5,7,MISSING='xxx') INTO sx1.
232 RECODE x (2 THRU 6,SYSMIS='xyz')(ELSE='foobar') INTO sx2.
235 AT_CHECK([pspp -O format=csv recode.sps], [0],
239 1,abcdefghij,xxx,foobar
245 7,abcdefghij,xxx,foobar
247 9,abcdefghij,xxx,foobar
252 AT_SETUP([RECODE bug in COPY])
253 AT_DATA([recode.sps],
264 ** Clearly, the else=copy is superfluous here
265 RECODE A ("1"="3") ("3"="1") (ELSE=COPY).
269 AT_CHECK([pspp -O format=csv recode.sps], [0],
270 [Table: Reading free-form data from INLINE.
283 AT_SETUP([RECODE bug in COPY with INTO])
284 AT_DATA([recode.sps],
296 RECODE A ("1"="3") ("3"="1") (ELSE=COPY) INTO a1.
300 AT_CHECK([pspp -O format=csv recode.sps], [0],
301 [Table: Reading free-form data from INLINE.
316 AT_SETUP([RECODE increased string widths])
318 AT_DATA([recode.sps],[dnl
319 data list notable list /x (a1) y (a8) z *.
327 recode x y ("a" = "first") .
332 AT_CHECK([pspp -O format=csv recode.sps], [1], [dnl
333 "error: Cannot recode because the variable x would require a width of 5 bytes or greater, but it has a width of only 1 bytes."
347 AT_SETUP([RECODE crash on invalid dest variable])
349 AT_DATA([recode.sps],[dnl
350 DATA LIST LIST NOTABLE/x (f1) s (a4) t (a10).
351 MISSING VALUES x(9)/s('xxx').
359 RECODE x (1=9) INTO ".
363 AT_CHECK([pspp -O format=csv recode.sps], [1], [ignore])