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