stats_package_syntax_file_generator 1.1.3 → 1.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/syntax_file/controller.rb +221 -213
- data/lib/syntax_file/maker.rb +96 -91
- data/lib/syntax_file/maker_rddi.rb +55 -55
- data/lib/syntax_file/maker_sas.rb +205 -204
- data/lib/syntax_file/maker_spss.rb +144 -143
- data/lib/syntax_file/maker_stata.rb +211 -211
- data/lib/syntax_file/maker_sts.rb +120 -120
- data/lib/syntax_file/value.rb +16 -15
- data/lib/syntax_file/variable.rb +41 -40
- data/tests/setup.rb +8 -8
- data/tests/tc_maker.rb +1 -1
- data/tests/tc_maker_stata.rb +1 -1
- metadata +13 -12
@@ -4,21 +4,21 @@
|
|
4
4
|
# https://github.com/mnpopcenter/stats_package_syntax_file_generator
|
5
5
|
|
6
6
|
module SyntaxFile
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
7
|
+
class MakerSPSS < Maker
|
8
|
+
|
9
|
+
def initialize (sfc, syntax_type)
|
10
|
+
super
|
11
|
+
m = @sfc.max_var_name_length
|
12
|
+
@var_loc_format = " %-#{m}s %s"
|
13
|
+
@var_lab_format = " %-#{m}s %s %s"
|
14
|
+
@cmd_end = '.'
|
15
|
+
@var_label_max_leng = 120
|
16
|
+
@val_label_max_leng = 120
|
17
|
+
@segment_max_leng = 100
|
18
|
+
end
|
19
|
+
|
20
|
+
def syntax
|
21
|
+
r = [
|
22
22
|
comments_start,
|
23
23
|
syn_cd,
|
24
24
|
blank,
|
@@ -28,167 +28,168 @@ module SyntaxFile
|
|
28
28
|
syn_execute,
|
29
29
|
blank,
|
30
30
|
comments_end,
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
31
|
+
]
|
32
|
+
r.flatten
|
33
|
+
end
|
34
|
+
|
35
|
+
def comments_start
|
36
|
+
convert_to_comments(super)
|
37
|
+
end
|
38
|
+
|
39
|
+
def comments_end
|
40
|
+
convert_to_comments(super)
|
41
|
+
end
|
42
|
+
|
43
|
+
def convert_to_comments (lines)
|
44
|
+
return [] if lines.empty?
|
45
|
+
lines.push @cmd_end
|
46
|
+
[
|
47
47
|
lines.map { |ln| '* ' + ln },
|
48
48
|
blank,
|
49
|
-
|
50
|
-
|
49
|
+
].flatten
|
50
|
+
end
|
51
51
|
|
52
|
-
|
53
|
-
|
54
|
-
|
52
|
+
def syn_cd
|
53
|
+
'cd ' + q(@sfc.data_dir_name) + @cmd_end
|
54
|
+
end
|
55
55
|
|
56
|
-
|
57
|
-
|
58
|
-
|
56
|
+
def syn_df
|
57
|
+
@sfc.data_structure == 'hier' ? syn_dfh : syn_dfr
|
58
|
+
end
|
59
59
|
|
60
|
-
|
61
|
-
|
60
|
+
def syn_dfr
|
61
|
+
r = [
|
62
62
|
syn_dfr_start,
|
63
63
|
syn_var_locations(@sfc.variables),
|
64
64
|
syntax_end,
|
65
|
-
|
66
|
-
|
67
|
-
|
65
|
+
]
|
66
|
+
r.flatten
|
67
|
+
end
|
68
68
|
|
69
|
-
|
70
|
-
|
71
|
-
|
69
|
+
def syn_dfr_start
|
70
|
+
'data list file = ' + q(@sfc.data_file_name) + ' /'
|
71
|
+
end
|
72
72
|
|
73
|
-
|
74
|
-
|
73
|
+
def syn_dfh
|
74
|
+
r = [
|
75
75
|
syn_dfh_file_type,
|
76
76
|
syn_dfh_data_blocks,
|
77
77
|
'end file type' + @cmd_end,
|
78
78
|
blank,
|
79
|
-
|
80
|
-
|
81
|
-
|
79
|
+
]
|
80
|
+
r.flatten
|
81
|
+
end
|
82
82
|
|
83
|
-
|
84
|
-
|
83
|
+
def syn_dfh_file_type
|
84
|
+
r = [
|
85
85
|
'file type ' + nested_or_mixed(),
|
86
86
|
' /file = ' + q(@sfc.data_file_name),
|
87
87
|
' /record = ' + var_loc_with_fmt(@sfc.record_type_var).to_s,
|
88
88
|
syntax_end,
|
89
|
-
|
90
|
-
|
91
|
-
|
89
|
+
]
|
90
|
+
r.flatten
|
91
|
+
end
|
92
92
|
|
93
|
-
|
94
|
-
|
93
|
+
def syn_dfh_data_blocks
|
94
|
+
r = @sfc.record_types.map { |rt|
|
95
95
|
[
|
96
|
-
|
97
|
-
|
98
|
-
|
96
|
+
syn_dfh_data_block_start(rt),
|
97
|
+
syn_var_locations(@sfc.get_vars_by_record_type(rt)),
|
98
|
+
syntax_end,
|
99
99
|
]
|
100
|
-
|
101
|
-
|
102
|
-
|
100
|
+
}
|
101
|
+
r.flatten
|
102
|
+
end
|
103
103
|
|
104
|
-
|
105
|
-
|
106
|
-
|
104
|
+
def syn_dfh_data_block_start (rt)
|
105
|
+
rt_var = @sfc.record_type_var
|
106
|
+
[
|
107
107
|
'record type ' + val_q(rt_var, val_as_s(rt_var, rt)) + @cmd_end,
|
108
108
|
'data list /',
|
109
|
-
|
110
|
-
|
109
|
+
]
|
110
|
+
end
|
111
111
|
|
112
|
-
|
113
|
-
|
114
|
-
|
112
|
+
def syn_var_locations (var_list)
|
113
|
+
var_list.map { |v| sprintf @var_loc_format, v.name, var_loc_with_fmt(v) }
|
114
|
+
end
|
115
115
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
116
|
+
def syn_var_labs (var_list = [])
|
117
|
+
var_list = @sfc.get_vars_with_var_labels if var_list.empty?
|
118
|
+
return [] if var_list.empty?
|
119
|
+
r = [
|
120
120
|
'variable labels',
|
121
121
|
var_list.map { |var| syn_var_lab_for_var(var) },
|
122
122
|
syntax_end,
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
123
|
+
]
|
124
|
+
r.flatten
|
125
|
+
end
|
126
|
+
|
127
|
+
def syn_var_lab_for_var (var)
|
128
|
+
lab = label_trunc(var.label, @var_label_max_leng)
|
129
|
+
lab_segments = label_segments(lab, @segment_max_leng).map { |s| q(s) }
|
130
|
+
weave_label_segments(@var_lab_format, [var.name], lab_segments, ' ', '+')
|
131
|
+
end
|
132
|
+
|
133
|
+
def syn_val_labs
|
134
|
+
var_list = @sfc.get_vars_with_values
|
135
|
+
return [] if var_list.empty?
|
136
|
+
r = [
|
137
137
|
'value labels',
|
138
138
|
syn_val_labs_for_var_list(var_list),
|
139
139
|
syntax_end,
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
140
|
+
]
|
141
|
+
r.flatten
|
142
|
+
end
|
143
|
+
|
144
|
+
def syn_val_labs_for_var_list (var_list)
|
145
|
+
var_list.map { |var| syn_val_labs_for_var(var) }
|
146
|
+
end
|
147
|
+
|
148
|
+
def syn_val_labs_for_var (var)
|
149
|
+
val_list = labelable_values(var)
|
150
|
+
return [] if val_list.empty?
|
151
|
+
m = max_value_length(var, val_list)
|
152
|
+
m = m + 2 if var.is_string_var
|
153
|
+
m = @segment_max_leng + 2 if m > @segment_max_leng + 2
|
154
|
+
value_format = " %-#{m}s %s %s"
|
155
|
+
r = [
|
156
156
|
syn_val_labs_for_var_start(var),
|
157
157
|
val_list.map { |val| syn_val_lab_for_val(var, val, value_format) },
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
158
|
+
]
|
159
|
+
r.flatten
|
160
|
+
end
|
161
|
+
|
162
|
+
def syn_val_labs_for_var_start (var)
|
163
|
+
' /' + var.name
|
164
|
+
end
|
165
|
+
|
166
|
+
def syn_val_lab_for_val (var, val, fmt)
|
167
|
+
lab = label_trunc(val.label, @val_label_max_leng)
|
168
|
+
lab = val.value if lab.nil? || (lab.strip.length == 0)
|
169
|
+
vs = val_as_s(var, val.value)
|
170
|
+
val_segments = label_segments(vs, @segment_max_leng).map { |s| val_q(var, s) }
|
171
|
+
lab_segments = label_segments(lab, @segment_max_leng).map { |s| q(s) }
|
172
|
+
weave_label_segments(fmt, val_segments, lab_segments, ' ', '+')
|
173
|
+
end
|
174
|
+
|
175
|
+
def syn_execute
|
176
|
+
'execute' + @cmd_end
|
177
|
+
end
|
178
|
+
|
179
|
+
def nested_or_mixed
|
180
|
+
@sfc.rectangularize ? 'nested' : 'mixed'
|
181
|
+
end
|
182
|
+
|
183
|
+
def var_loc_with_fmt (var)
|
184
|
+
var.column_locations_as_s + var_fmt(var)
|
185
|
+
end
|
186
|
+
|
187
|
+
def var_fmt (var)
|
188
|
+
return ' (a)' if var.is_string_var
|
189
|
+
return ' (2) ' if var.is_double_var
|
190
|
+
return '' unless var.implied_decimals > 0
|
191
|
+
return ' (' + var.implied_decimals.to_s + ')'
|
192
|
+
end
|
193
|
+
|
194
|
+
end
|
194
195
|
end
|
@@ -4,29 +4,32 @@
|
|
4
4
|
# https://github.com/mnpopcenter/stats_package_syntax_file_generator
|
5
5
|
|
6
6
|
module SyntaxFile
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
7
|
+
class MakerSTATA < Maker
|
8
|
+
|
9
|
+
def initialize (sfc, syntax_type)
|
10
|
+
super
|
11
|
+
|
12
|
+
|
13
|
+
mx_var = @sfc.max_var_name_length
|
14
|
+
mx_col = 2 * @sfc.max_col_loc_width + 1
|
15
|
+
@var_loc_format = " %-7s %-#{mx_var}s %-#{mx_col}s %s"
|
16
|
+
@var_lab_format = "label var %-#{mx_var}s %s"
|
17
|
+
@infix_format = "%#{mx_col + mx_var + 4}s"
|
18
|
+
@replace_format = "replace %-#{mx_var}s = %-#{mx_var}s / %d"
|
19
|
+
@fixed_point_display_format = "format %-#{mx_var}s %%%d.%df"
|
20
|
+
@general_display_format = "format %-#{mx_var}s %%%d.%dg"
|
21
|
+
@integer_display_format = "format %-#{mx_var}s %%%d.%df"
|
22
|
+
|
23
|
+
|
24
|
+
@cmd_end = ''
|
25
|
+
@cmd_continue = ' ///'
|
26
|
+
@var_label_max_leng = 80
|
27
|
+
@val_label_max_leng = 244
|
28
|
+
@sort_var_stem = '_line_num'
|
29
|
+
end
|
27
30
|
|
28
|
-
|
29
|
-
|
31
|
+
def syntax
|
32
|
+
r = [
|
30
33
|
comments_start,
|
31
34
|
'set more off',
|
32
35
|
blank,
|
@@ -41,278 +44,275 @@ module SyntaxFile
|
|
41
44
|
syn_val_labs,
|
42
45
|
blank,
|
43
46
|
comments_end,
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
+
]
|
48
|
+
r.flatten
|
49
|
+
end
|
47
50
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
+
def comments_start
|
52
|
+
convert_to_comments(super)
|
53
|
+
end
|
51
54
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
+
def comments_end
|
56
|
+
convert_to_comments(super)
|
57
|
+
end
|
55
58
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
+
def convert_to_comments (lines)
|
60
|
+
return [] if lines.empty?
|
61
|
+
[
|
59
62
|
lines.map { |ln| '* ' + ln },
|
60
63
|
blank,
|
61
|
-
|
62
|
-
|
64
|
+
].flatten
|
65
|
+
end
|
63
66
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
+
def syn_df
|
68
|
+
@sfc.data_structure == 'hier' ? syn_dfh : syn_dfr
|
69
|
+
end
|
67
70
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
+
def syn_dfr
|
72
|
+
syn_infix(@sfc.variables)
|
73
|
+
end
|
71
74
|
|
72
|
-
|
73
|
-
|
75
|
+
def syn_dfh
|
76
|
+
r = [
|
74
77
|
syn_dfh_infix_blocks,
|
75
78
|
syn_dfh_combine,
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
+
]
|
80
|
+
r.flatten
|
81
|
+
end
|
79
82
|
|
80
|
-
|
81
|
-
|
83
|
+
def syn_infix (var_list)
|
84
|
+
r = [
|
82
85
|
syn_infix_start,
|
83
86
|
syn_infix_var_locs(var_list),
|
84
87
|
syn_infix_end,
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
+
]
|
89
|
+
r.flatten
|
90
|
+
end
|
88
91
|
|
89
|
-
|
90
|
-
|
92
|
+
def syn_infix_start
|
93
|
+
[
|
91
94
|
'clear',
|
92
95
|
'quietly infix' + sprintf(@infix_format, @cmd_continue),
|
93
|
-
|
94
|
-
|
96
|
+
]
|
97
|
+
end
|
95
98
|
|
96
|
-
|
97
|
-
|
99
|
+
def syn_infix_var_locs (var_list)
|
100
|
+
var_list.map { |v|
|
98
101
|
sprintf @var_loc_format,
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
102
|
+
var_fmt(v),
|
103
|
+
v.name.downcase,
|
104
|
+
v.column_locations_as_s,
|
105
|
+
@cmd_continue
|
106
|
+
}
|
107
|
+
end
|
105
108
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
+
def syn_infix_end
|
110
|
+
' using ' + q(@sfc.data_file_name)
|
111
|
+
end
|
109
112
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
+
def syn_dfh_infix_blocks
|
114
|
+
r = []
|
115
|
+
@sfc.record_types.each { |rt|
|
113
116
|
var_list = @sfc.get_vars_by_record_type(rt)
|
114
117
|
r.push(
|
115
|
-
|
116
|
-
|
118
|
+
syn_infix(var_list),
|
119
|
+
syn_dfh_infix_block_end(rt)
|
117
120
|
) if var_list.size > 0
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
+
}
|
122
|
+
r.flatten
|
123
|
+
end
|
121
124
|
|
122
|
-
|
123
|
-
|
125
|
+
def syn_dfh_infix_block_end (rt)
|
126
|
+
r = [
|
124
127
|
syn_dfh_infix_gen,
|
125
128
|
'drop if ' + rt_ne_statement(rt),
|
126
129
|
'sort ' + sort_vars.join(' '),
|
127
130
|
'save ' + temp_file_name(rt),
|
128
131
|
blank,
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
+
]
|
133
|
+
r.flatten
|
134
|
+
end
|
132
135
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
136
|
+
def syn_dfh_infix_gen
|
137
|
+
return ["gen #{@sort_var_stem} = _n"] unless @sfc.rectangularize
|
138
|
+
sv = sort_vars()
|
139
|
+
r = [
|
137
140
|
sv.map { |v| "gen #{v} = _n" },
|
138
141
|
sv.zip(@sfc.record_types).map { |z|
|
139
|
-
|
140
|
-
z[0]
|
141
|
-
' = '
|
142
|
-
z[0]
|
142
|
+
'replace ' +
|
143
|
+
z[0] +
|
144
|
+
' = ' +
|
145
|
+
z[0] +
|
143
146
|
'[_n - 1] if _n > 1 & ' +
|
144
147
|
rt_ne_statement(z[1])
|
145
148
|
}
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
+
]
|
150
|
+
r.flatten!
|
151
|
+
end
|
149
152
|
|
150
|
-
|
151
|
-
|
153
|
+
def syn_dfh_combine
|
154
|
+
r = [
|
152
155
|
'clear',
|
153
156
|
syn_dfh_combine_append,
|
154
157
|
syn_dfh_combine_save,
|
155
158
|
syn_dfh_combine_erase,
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
+
]
|
160
|
+
r.flatten
|
161
|
+
end
|
159
162
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
163
|
+
def syn_dfh_combine_append
|
164
|
+
r = []
|
165
|
+
tf = temp_file_names()
|
166
|
+
if @sfc.rectangularize
|
164
167
|
sv = sort_vars.reverse
|
165
168
|
tf = tf.reverse
|
166
169
|
sv.shift
|
167
170
|
r.push 'use ' + tf.shift
|
168
171
|
sv.zip(tf).each { |z|
|
169
|
-
|
170
|
-
|
172
|
+
r.push 'merge m:1 ' + z[0] + ' using ' + z[1] + ', keep(master match)'
|
173
|
+
r.push 'drop _merge'
|
171
174
|
}
|
172
|
-
|
175
|
+
else
|
173
176
|
r.push 'use ' + tf.shift
|
174
177
|
tf.each { |t| r.push 'append using ' + t }
|
175
|
-
end
|
176
|
-
r
|
177
178
|
end
|
179
|
+
r
|
180
|
+
end
|
178
181
|
|
179
|
-
|
180
|
-
|
182
|
+
def syn_dfh_combine_save
|
183
|
+
[
|
181
184
|
'sort ' + sort_vars.join(' '),
|
182
185
|
'drop ' + sort_vars.join(' '),
|
183
|
-
|
184
|
-
|
186
|
+
]
|
187
|
+
end
|
185
188
|
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
+
def syn_dfh_combine_erase
|
190
|
+
temp_file_names.map { |t| 'erase ' + t }
|
191
|
+
end
|
189
192
|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
193
|
+
def syn_convert_implied_decim
|
194
|
+
var_list = @sfc.variables.find_all { |var| var.implied_decimals > 0 }
|
195
|
+
return [] if var_list.empty?
|
196
|
+
var_list.map { |var|
|
194
197
|
v = var.name.downcase
|
195
198
|
sprintf @replace_format, v, v, 10 ** var.implied_decimals
|
196
|
-
|
197
|
-
|
199
|
+
}
|
200
|
+
end
|
198
201
|
|
199
|
-
|
200
|
-
|
202
|
+
def syn_display_format
|
203
|
+
var_list = @sfc.variables.find_all { |var|
|
201
204
|
vf = var_fmt(var)
|
202
205
|
vf == 'double' or vf == 'float'
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
+
}
|
207
|
+
return [] if var_list.empty?
|
208
|
+
var_list.map { |var|
|
206
209
|
v = var.name.downcase
|
210
|
+
|
211
|
+
# If implied decimals set, it means we know exactly how much precision
|
212
|
+
# to show.
|
213
|
+
# Otherwise we go with the underlying value and the 'g' (general) formatting rules in Stata
|
214
|
+
# when the variable is a double float in our metadata, or use .0f for formatting if the
|
215
|
+
# number is a integer in our metadata: In Stata you store large integer type data in
|
216
|
+
# 'double' or 'long double' type variables. It's confusing.
|
217
|
+
formatting = if var.implied_decimals > 0
|
218
|
+
sprintf(@fixed_point_display_format, v, var.width, var.implied_decimals)
|
219
|
+
elsif var.is_double_var
|
220
|
+
sprintf(@general_display_format, v, var.width, var.implied_decimals)
|
221
|
+
else
|
222
|
+
sprintf(@integer_display_format, v, var.width, 0)
|
223
|
+
end
|
224
|
+
|
225
|
+
formatting
|
226
|
+
}
|
227
|
+
end
|
207
228
|
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
sprintf(@general_display_format, v, var.width, var.implied_decimals)
|
213
|
-
|
214
|
-
formatting
|
215
|
-
}
|
216
|
-
end
|
217
|
-
|
218
|
-
def syn_var_labs(var_list = [])
|
219
|
-
var_list = @sfc.get_vars_with_var_labels if var_list.empty?
|
220
|
-
return [] if var_list.empty?
|
221
|
-
var_list.map { |var|
|
229
|
+
def syn_var_labs (var_list = [])
|
230
|
+
var_list = @sfc.get_vars_with_var_labels if var_list.empty?
|
231
|
+
return [] if var_list.empty?
|
232
|
+
var_list.map { |var|
|
222
233
|
sprintf @var_lab_format,
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
234
|
+
var.name.downcase,
|
235
|
+
q( label_trunc(var.label, @var_label_max_leng) )
|
236
|
+
}
|
237
|
+
end
|
227
238
|
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
[
|
235
|
-
labels,
|
239
|
+
def syn_val_labs
|
240
|
+
var_list = @sfc.get_vars_with_values.find_all { |var| not var.is_string_var }
|
241
|
+
return [] if var_list.empty?
|
242
|
+
r = var_list.map { |var|
|
243
|
+
[
|
244
|
+
syn_val_labs_for_var(var),
|
236
245
|
"label values " + var.name.downcase + ' ' + label_handle(var),
|
237
246
|
blank,
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
}
|
243
|
-
r.flatten
|
244
|
-
end
|
245
|
-
|
246
|
-
def syn_val_labs_for_var(var)
|
247
|
-
val_list = labelable_values(var)
|
248
|
-
return [] if val_list.empty?
|
249
|
-
m = max_value_length(var, val_list)
|
250
|
-
|
251
|
-
# A Stata value 10 digits or wider cannot be labeled.
|
252
|
-
if m >= 10
|
253
|
-
return []
|
254
|
-
end
|
247
|
+
]
|
248
|
+
}
|
249
|
+
r.flatten
|
250
|
+
end
|
255
251
|
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
252
|
+
def syn_val_labs_for_var (var)
|
253
|
+
val_list = labelable_values(var)
|
254
|
+
return [] if val_list.empty?
|
255
|
+
m = max_value_length(var, val_list)
|
256
|
+
value_format = "label define %s %-#{m}s %s%s"
|
257
|
+
add_cmd = ''
|
258
|
+
r = []
|
259
|
+
val_list.each { |val|
|
260
260
|
label_truncated = label_trunc(val.label, @val_label_max_leng)
|
261
261
|
# stata doesn't like blank value labels
|
262
262
|
label_truncated = val.value if label_truncated.nil? || (label_truncated.strip.length == 0)
|
263
263
|
r.push sprintf(
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
264
|
+
value_format,
|
265
|
+
label_handle(var),
|
266
|
+
val.value,
|
267
|
+
q( label_truncated ),
|
268
|
+
add_cmd
|
269
269
|
)
|
270
270
|
add_cmd = ', add'
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
def q(s)
|
276
|
-
'`"' + s.to_s + '"\''
|
277
|
-
end
|
271
|
+
}
|
272
|
+
r.flatten
|
273
|
+
end
|
278
274
|
|
279
|
-
|
275
|
+
def q (s)
|
276
|
+
'`"' + s.to_s + '"\''
|
277
|
+
end
|
280
278
|
|
281
|
-
|
282
|
-
return 'double' if var.is_double_var || var.implied_decimals > 0
|
283
|
-
return 'byte' if var.width <= 2
|
284
|
-
return 'int' if var.width <= 4
|
285
|
-
return 'long' if var.width <= 7
|
279
|
+
def var_fmt (var)
|
286
280
|
|
287
|
-
|
288
|
-
|
281
|
+
return 'str' if var.is_string_var
|
282
|
+
return 'double' if var.is_double_var || var.implied_decimals > 0
|
283
|
+
return 'byte' if var.width <= 2
|
284
|
+
return 'int' if var.width <= 4
|
285
|
+
return 'long' if var.width <= 7
|
286
|
+
|
287
|
+
return 'double'
|
288
|
+
end
|
289
289
|
|
290
|
-
|
291
|
-
|
292
|
-
|
290
|
+
def temp_file_names
|
291
|
+
tf = []
|
292
|
+
@sfc.record_types.each { |rt|
|
293
293
|
var_list = @sfc.get_vars_by_record_type(rt)
|
294
294
|
tf.push temp_file_name(rt) if var_list.size > 0
|
295
|
-
|
296
|
-
|
297
|
-
|
295
|
+
}
|
296
|
+
tf
|
297
|
+
end
|
298
298
|
|
299
|
-
|
300
|
-
|
301
|
-
|
299
|
+
def temp_file_name (rt)
|
300
|
+
'__temp_ipums_hier_' + rt + '.dta'
|
301
|
+
end
|
302
302
|
|
303
|
-
|
304
|
-
|
305
|
-
|
303
|
+
def label_handle (var)
|
304
|
+
var.name.downcase + '_lbl'
|
305
|
+
end
|
306
306
|
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
307
|
+
def sort_vars
|
308
|
+
return [ @sort_var_stem ] unless @sfc.rectangularize
|
309
|
+
return @sfc.record_types.map { |rt| @sort_var_stem + rt }
|
310
|
+
end
|
311
311
|
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
312
|
+
def rt_ne_statement (rt)
|
313
|
+
rt_var = @sfc.record_type_var
|
314
|
+
rt_var.name.downcase + ' != ' + val_q(rt_var, val_as_s(rt_var, rt))
|
315
|
+
end
|
316
316
|
|
317
|
-
|
317
|
+
end
|
318
318
|
end
|