stats_package_syntax_file_generator 1.1.2 → 1.1.8
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 +220 -201
- 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
- data/tests/tc_maker_stata.rb +1 -1
- metadata +6 -7
@@ -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,30 @@
|
|
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.0g"
|
20
|
+
@integer_display_format = "format %-#{mx_var}s %%%d.0f"
|
21
|
+
|
22
|
+
@cmd_end = ''
|
23
|
+
@cmd_continue = ' ///'
|
24
|
+
@var_label_max_leng = 80
|
25
|
+
@val_label_max_leng = 244
|
26
|
+
@sort_var_stem = '_line_num'
|
27
|
+
end
|
28
28
|
|
29
|
-
def syntax
|
30
|
-
|
29
|
+
def syntax
|
30
|
+
r = [
|
31
31
|
comments_start,
|
32
32
|
'set more off',
|
33
33
|
blank,
|
@@ -42,267 +42,286 @@ def syntax
|
|
42
42
|
syn_val_labs,
|
43
43
|
blank,
|
44
44
|
comments_end,
|
45
|
-
|
46
|
-
|
47
|
-
end
|
45
|
+
]
|
46
|
+
r.flatten
|
47
|
+
end
|
48
48
|
|
49
|
-
def comments_start
|
50
|
-
|
51
|
-
end
|
49
|
+
def comments_start
|
50
|
+
convert_to_comments(super)
|
51
|
+
end
|
52
52
|
|
53
|
-
def comments_end
|
54
|
-
|
55
|
-
end
|
53
|
+
def comments_end
|
54
|
+
convert_to_comments(super)
|
55
|
+
end
|
56
56
|
|
57
|
-
def convert_to_comments
|
58
|
-
|
59
|
-
|
57
|
+
def convert_to_comments(lines)
|
58
|
+
return [] if lines.empty?
|
59
|
+
[
|
60
60
|
lines.map { |ln| '* ' + ln },
|
61
61
|
blank,
|
62
|
-
|
63
|
-
end
|
62
|
+
].flatten
|
63
|
+
end
|
64
64
|
|
65
|
-
def syn_df
|
66
|
-
|
67
|
-
end
|
65
|
+
def syn_df
|
66
|
+
@sfc.data_structure == 'hier' ? syn_dfh : syn_dfr
|
67
|
+
end
|
68
68
|
|
69
|
-
def syn_dfr
|
70
|
-
|
71
|
-
end
|
69
|
+
def syn_dfr
|
70
|
+
syn_infix(@sfc.variables)
|
71
|
+
end
|
72
72
|
|
73
|
-
def syn_dfh
|
74
|
-
|
73
|
+
def syn_dfh
|
74
|
+
r = [
|
75
75
|
syn_dfh_infix_blocks,
|
76
76
|
syn_dfh_combine,
|
77
|
-
|
78
|
-
|
79
|
-
end
|
77
|
+
]
|
78
|
+
r.flatten
|
79
|
+
end
|
80
80
|
|
81
|
-
def syn_infix
|
82
|
-
|
81
|
+
def syn_infix(var_list)
|
82
|
+
r = [
|
83
83
|
syn_infix_start,
|
84
84
|
syn_infix_var_locs(var_list),
|
85
85
|
syn_infix_end,
|
86
|
-
|
87
|
-
|
88
|
-
end
|
86
|
+
]
|
87
|
+
r.flatten
|
88
|
+
end
|
89
89
|
|
90
|
-
def syn_infix_start
|
91
|
-
|
90
|
+
def syn_infix_start
|
91
|
+
[
|
92
92
|
'clear',
|
93
93
|
'quietly infix' + sprintf(@infix_format, @cmd_continue),
|
94
|
-
|
95
|
-
end
|
94
|
+
]
|
95
|
+
end
|
96
96
|
|
97
|
-
def syn_infix_var_locs
|
98
|
-
|
97
|
+
def syn_infix_var_locs(var_list)
|
98
|
+
var_list.map { |v|
|
99
99
|
sprintf @var_loc_format,
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
end
|
100
|
+
var_fmt(v),
|
101
|
+
v.name.downcase,
|
102
|
+
v.column_locations_as_s,
|
103
|
+
@cmd_continue
|
104
|
+
}
|
105
|
+
end
|
106
106
|
|
107
|
-
def syn_infix_end
|
108
|
-
|
109
|
-
end
|
107
|
+
def syn_infix_end
|
108
|
+
' using ' + q(@sfc.data_file_name)
|
109
|
+
end
|
110
110
|
|
111
|
-
def syn_dfh_infix_blocks
|
112
|
-
|
113
|
-
|
111
|
+
def syn_dfh_infix_blocks
|
112
|
+
r = []
|
113
|
+
@sfc.record_types.each { |rt|
|
114
114
|
var_list = @sfc.get_vars_by_record_type(rt)
|
115
115
|
r.push(
|
116
|
-
|
117
|
-
|
116
|
+
syn_infix(var_list),
|
117
|
+
syn_dfh_infix_block_end(rt)
|
118
118
|
) if var_list.size > 0
|
119
|
-
|
120
|
-
|
121
|
-
end
|
119
|
+
}
|
120
|
+
r.flatten
|
121
|
+
end
|
122
122
|
|
123
|
-
def syn_dfh_infix_block_end
|
124
|
-
|
123
|
+
def syn_dfh_infix_block_end(rt)
|
124
|
+
r = [
|
125
125
|
syn_dfh_infix_gen,
|
126
126
|
'drop if ' + rt_ne_statement(rt),
|
127
127
|
'sort ' + sort_vars.join(' '),
|
128
128
|
'save ' + temp_file_name(rt),
|
129
129
|
blank,
|
130
|
-
|
131
|
-
|
132
|
-
end
|
130
|
+
]
|
131
|
+
r.flatten
|
132
|
+
end
|
133
133
|
|
134
|
-
def syn_dfh_infix_gen
|
135
|
-
|
136
|
-
|
137
|
-
|
134
|
+
def syn_dfh_infix_gen
|
135
|
+
return ["gen #{@sort_var_stem} = _n"] unless @sfc.rectangularize
|
136
|
+
sv = sort_vars()
|
137
|
+
r = [
|
138
138
|
sv.map { |v| "gen #{v} = _n" },
|
139
139
|
sv.zip(@sfc.record_types).map { |z|
|
140
|
-
|
141
|
-
z[0]
|
142
|
-
' = '
|
143
|
-
z[0]
|
140
|
+
'replace ' +
|
141
|
+
z[0] +
|
142
|
+
' = ' +
|
143
|
+
z[0] +
|
144
144
|
'[_n - 1] if _n > 1 & ' +
|
145
145
|
rt_ne_statement(z[1])
|
146
146
|
}
|
147
|
-
|
148
|
-
|
149
|
-
end
|
147
|
+
]
|
148
|
+
r.flatten!
|
149
|
+
end
|
150
150
|
|
151
|
-
def syn_dfh_combine
|
152
|
-
|
151
|
+
def syn_dfh_combine
|
152
|
+
r = [
|
153
153
|
'clear',
|
154
154
|
syn_dfh_combine_append,
|
155
155
|
syn_dfh_combine_save,
|
156
156
|
syn_dfh_combine_erase,
|
157
|
-
|
158
|
-
|
159
|
-
end
|
157
|
+
]
|
158
|
+
r.flatten
|
159
|
+
end
|
160
160
|
|
161
|
-
def syn_dfh_combine_append
|
162
|
-
|
163
|
-
|
164
|
-
|
161
|
+
def syn_dfh_combine_append
|
162
|
+
r = []
|
163
|
+
tf = temp_file_names()
|
164
|
+
if @sfc.rectangularize
|
165
165
|
sv = sort_vars.reverse
|
166
166
|
tf = tf.reverse
|
167
167
|
sv.shift
|
168
168
|
r.push 'use ' + tf.shift
|
169
169
|
sv.zip(tf).each { |z|
|
170
|
-
|
171
|
-
|
170
|
+
r.push 'merge m:1 ' + z[0] + ' using ' + z[1] + ', keep(master match)'
|
171
|
+
r.push 'drop _merge'
|
172
172
|
}
|
173
|
-
|
173
|
+
else
|
174
174
|
r.push 'use ' + tf.shift
|
175
175
|
tf.each { |t| r.push 'append using ' + t }
|
176
|
+
end
|
177
|
+
r
|
176
178
|
end
|
177
|
-
r
|
178
|
-
end
|
179
179
|
|
180
|
-
def syn_dfh_combine_save
|
181
|
-
|
180
|
+
def syn_dfh_combine_save
|
181
|
+
[
|
182
182
|
'sort ' + sort_vars.join(' '),
|
183
183
|
'drop ' + sort_vars.join(' '),
|
184
|
-
|
185
|
-
end
|
184
|
+
]
|
185
|
+
end
|
186
186
|
|
187
|
-
def syn_dfh_combine_erase
|
188
|
-
|
189
|
-
end
|
187
|
+
def syn_dfh_combine_erase
|
188
|
+
temp_file_names.map { |t| 'erase ' + t }
|
189
|
+
end
|
190
190
|
|
191
|
-
def syn_convert_implied_decim
|
192
|
-
|
193
|
-
|
194
|
-
|
191
|
+
def syn_convert_implied_decim
|
192
|
+
var_list = @sfc.variables.find_all { |var| var.implied_decimals > 0 }
|
193
|
+
return [] if var_list.empty?
|
194
|
+
var_list.map { |var|
|
195
195
|
v = var.name.downcase
|
196
196
|
sprintf @replace_format, v, v, 10 ** var.implied_decimals
|
197
|
-
|
198
|
-
end
|
197
|
+
}
|
198
|
+
end
|
199
199
|
|
200
|
-
def syn_display_format
|
201
|
-
|
200
|
+
def syn_display_format
|
201
|
+
var_list = @sfc.variables.find_all { |var|
|
202
202
|
vf = var_fmt(var)
|
203
203
|
vf == 'double' or vf == 'float'
|
204
|
-
|
205
|
-
|
206
|
-
|
204
|
+
}
|
205
|
+
return [] if var_list.empty?
|
206
|
+
var_list.map { |var|
|
207
207
|
v = var.name.downcase
|
208
|
-
|
209
|
-
# If implied decimals set, it means we know exactly how much precision
|
210
|
-
# to show. Otherwise we go with the underlying value and the 'g' (general) formatting rules in Stata
|
211
|
-
formatting = var.implied_decimals > 0 ?
|
212
|
-
sprintf(@fixed_point_display_format, v, var.width, var.implied_decimals) :
|
213
|
-
sprintf(@general_display_format, v, var.width, var.implied_decimals)
|
214
|
-
|
215
|
-
formatting
|
216
|
-
}
|
217
|
-
end
|
218
208
|
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
209
|
+
# When implied decimals are set, it means we know exactly how much precision to show: '.nf' where n is the
|
210
|
+
# number of implied decimals.
|
211
|
+
# When the number is a double float in our metadata, we go with the underlying value and the '.0g' (general)
|
212
|
+
# formatting rules in Stata.
|
213
|
+
# Otherwise the variable is a integer in our metadata, and we therefore use '.0f' for formatting
|
214
|
+
#
|
215
|
+
# In Stata you store large integer type data in 'double' or 'long double' type variables. It's confusing.
|
216
|
+
case
|
217
|
+
when var.implied_decimals > 0
|
218
|
+
sprintf(@fixed_point_display_format, v, var.width, var.implied_decimals)
|
219
|
+
when var.is_double_var
|
220
|
+
sprintf(@general_display_format, v, var.width)
|
221
|
+
else # default is integer
|
222
|
+
sprintf(@integer_display_format, v, var.width)
|
223
|
+
end
|
224
|
+
}
|
225
|
+
end
|
226
|
+
|
227
|
+
def syn_var_labs(var_list = [])
|
228
|
+
var_list = @sfc.get_vars_with_var_labels if var_list.empty?
|
229
|
+
return [] if var_list.empty?
|
230
|
+
var_list.map { |var|
|
223
231
|
sprintf @var_lab_format,
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
end
|
232
|
+
var.name.downcase,
|
233
|
+
q(label_trunc(var.label, @var_label_max_leng))
|
234
|
+
}
|
235
|
+
end
|
228
236
|
|
229
|
-
def syn_val_labs
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
237
|
+
def syn_val_labs
|
238
|
+
var_list = @sfc.get_vars_with_values.find_all { |var| not var.is_string_var }
|
239
|
+
return [] if var_list.empty?
|
240
|
+
r = var_list.map { |var|
|
241
|
+
labels = syn_val_labs_for_var(var)
|
242
|
+
if labels.any?
|
243
|
+
[
|
244
|
+
labels,
|
235
245
|
"label values " + var.name.downcase + ' ' + label_handle(var),
|
236
246
|
blank,
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
end
|
247
|
+
]
|
248
|
+
else
|
249
|
+
[]
|
250
|
+
end
|
251
|
+
}
|
252
|
+
r.flatten
|
253
|
+
end
|
241
254
|
|
242
|
-
def syn_val_labs_for_var
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
255
|
+
def syn_val_labs_for_var(var)
|
256
|
+
val_list = labelable_values(var)
|
257
|
+
return [] if val_list.empty?
|
258
|
+
m = max_value_length(var, val_list)
|
259
|
+
|
260
|
+
# A Stata value 10 digits or wider cannot be labeled.
|
261
|
+
if m >= 10
|
262
|
+
return []
|
263
|
+
end
|
264
|
+
|
265
|
+
value_format = "label define %s %-#{m}s %s%s"
|
266
|
+
add_cmd = ''
|
267
|
+
r = []
|
268
|
+
val_list.each { |val|
|
250
269
|
label_truncated = label_trunc(val.label, @val_label_max_leng)
|
251
270
|
# stata doesn't like blank value labels
|
252
271
|
label_truncated = val.value if label_truncated.nil? || (label_truncated.strip.length == 0)
|
253
272
|
r.push sprintf(
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
273
|
+
value_format,
|
274
|
+
label_handle(var),
|
275
|
+
val.value,
|
276
|
+
q(label_truncated),
|
277
|
+
add_cmd
|
259
278
|
)
|
260
279
|
add_cmd = ', add'
|
261
|
-
|
262
|
-
|
263
|
-
end
|
280
|
+
}
|
281
|
+
r.flatten
|
282
|
+
end
|
264
283
|
|
265
|
-
def q
|
266
|
-
|
267
|
-
end
|
284
|
+
def q(s)
|
285
|
+
'`"' + s.to_s + '"\''
|
286
|
+
end
|
268
287
|
|
269
|
-
def var_fmt
|
288
|
+
def var_fmt(var)
|
270
289
|
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
end
|
290
|
+
return 'str' if var.is_string_var
|
291
|
+
return 'double' if var.is_double_var || var.implied_decimals > 0
|
292
|
+
return 'byte' if var.width <= 2
|
293
|
+
return 'int' if var.width <= 4
|
294
|
+
return 'long' if var.width <= 7
|
295
|
+
|
296
|
+
return 'double'
|
297
|
+
end
|
279
298
|
|
280
|
-
def temp_file_names
|
281
|
-
|
282
|
-
|
299
|
+
def temp_file_names
|
300
|
+
tf = []
|
301
|
+
@sfc.record_types.each { |rt|
|
283
302
|
var_list = @sfc.get_vars_by_record_type(rt)
|
284
303
|
tf.push temp_file_name(rt) if var_list.size > 0
|
285
|
-
|
286
|
-
|
287
|
-
end
|
304
|
+
}
|
305
|
+
tf
|
306
|
+
end
|
288
307
|
|
289
|
-
def temp_file_name
|
290
|
-
|
291
|
-
end
|
308
|
+
def temp_file_name(rt)
|
309
|
+
'__temp_ipums_hier_' + rt + '.dta'
|
310
|
+
end
|
292
311
|
|
293
|
-
def label_handle
|
294
|
-
|
295
|
-
end
|
312
|
+
def label_handle(var)
|
313
|
+
var.name.downcase + '_lbl'
|
314
|
+
end
|
296
315
|
|
297
|
-
def sort_vars
|
298
|
-
|
299
|
-
|
300
|
-
end
|
316
|
+
def sort_vars
|
317
|
+
return [@sort_var_stem] unless @sfc.rectangularize
|
318
|
+
return @sfc.record_types.map { |rt| @sort_var_stem + rt }
|
319
|
+
end
|
301
320
|
|
302
|
-
def rt_ne_statement
|
303
|
-
|
304
|
-
|
305
|
-
end
|
321
|
+
def rt_ne_statement(rt)
|
322
|
+
rt_var = @sfc.record_type_var
|
323
|
+
rt_var.name.downcase + ' != ' + val_q(rt_var, val_as_s(rt_var, rt))
|
324
|
+
end
|
306
325
|
|
307
|
-
end
|
326
|
+
end
|
308
327
|
end
|