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