-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathempty_field_values.rb
More file actions
124 lines (116 loc) · 3.57 KB
/
Copy pathempty_field_values.rb
File metadata and controls
124 lines (116 loc) · 3.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# frozen_string_literal: true
module Kiba
module Extend
module Transforms
module Delete
# @note Only useful for multi-valued fields
#
# Deletes any empty values from the field. Supports `usenull` = true to
# treat the value of `Kiba::Extend.nullvalue` as empty
#
# # Examples
#
# Assuming `Kiba::Extend.nullvalue` = `%NULLVALUE%`, and input table:
#
# ~~~
# | data |
# |------------------|
# | abc;;;d e f |
# | ;;abc |
# | def;;;; |
# | ;;;;; |
# | ;;;%NULLVALUE%;; |
# | |
# | nil |
# ~~~
#
# Used in pipeline as:
#
# ~~~
# transform Delete::EmptyFieldValues, fields: [:data], sep: ';'
# ~~~
#
# Results in:
#
# ~~~
# | data |
# |-------------|
# | abc;d e f |
# | abc |
# | def |
# | |
# | %NULLVALUE% |
# | |
# | nil |
# ~~~
#
# Used in pipeline as:
#
# ~~~
# transform Delete::EmptyFieldValues, fields: [:data], sep: ';',
# usenull: true
# ~~~
#
# Results in:
#
# ~~~
# | data |
# |-----------|
# | abc;d e f |
# | abc |
# | def |
# | |
# | |
# | |
# | nil |
# ~~~
#
class EmptyFieldValues
include Allable
# @note `sep` will be removed in a future version. **DO NOT USE**
# @param fields [Array<Symbol>,Symbol] field(s) to delete from
# @param sep [String] **DEPRECATED; DO NOT USE**
# @param delim [String] on which to split multivalued fields. Defaults
# to `Kiba::Extend.delim` if not provided.
# @param usenull [Boolean] whether to treat `Kiba::Extend.nullvalue`
# string as an empty value
# @param omit_from_all_fields [Array<Symbol>] fields to omit from
# inclusion in "all" fields; does nothing if individual field values
# are passed in
def initialize(fields:, sep: nil, delim: nil, usenull: false,
omit_from_all_fields: [])
@fields = [fields].flatten
@usenull = usenull
@omit_from_all_fields = omit_from_all_fields
if sep && delim
puts "#{Kiba::Extend.warning_label}: Do not use both `sep` "\
"and `delim`. Prefer `delim`"
elsif sep
puts "#{Kiba::Extend.warning_label}: The `sep` keyword is being "\
"deprecated in a future version. Change it to `delim` in "\
"your ETL code."
@delim = sep
else
@delim = delim || Kiba::Extend.delim
end
end
# @param row [Hash{ Symbol => String, nil }]
def process(row)
finalize_fields(row) unless fields_set
fields.each do |field|
val = row[field]
next if val.blank?
row[field] = val.split(delim)
.compact
.reject { |str| Helpers.empty?(str, usenull) }
.join(delim)
end
row
end
private
attr_reader :fields, :delim, :usenull
end
end
end
end
end