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