Class: FlatKit::Command::Merge
- Inherits:
-
FlatKit::Command
- Object
- FlatKit::Command
- FlatKit::Command::Merge
- Defined in:
- lib/flat_kit/command/merge.rb
Overview
Internal: The implementation of the merge command.
Instance Attribute Summary collapse
-
#compare_keys ⇒ Object
readonly
Returns the value of attribute compare_keys.
Attributes inherited from FlatKit::Command
#argv, #env, #logger, #opts, #readers, #writer
Class Method Summary collapse
Instance Method Summary collapse
Methods inherited from FlatKit::Command
Methods included from DescendantTracker
#children, #find_child, #find_children, #inherited
Constructor Details
This class inherits a constructor from FlatKit::Command
Instance Attribute Details
#compare_keys ⇒ Object (readonly)
Returns the value of attribute compare_keys.
66 67 68 |
# File 'lib/flat_kit/command/merge.rb', line 66 def compare_keys @compare_keys end |
Class Method Details
.description ⇒ Object
13 14 15 |
# File 'lib/flat_kit/command/merge.rb', line 13 def self.description "Merge sorted files together that have the same structure." end |
.name ⇒ Object
9 10 11 |
# File 'lib/flat_kit/command/merge.rb', line 9 def self.name "merge" end |
.parser ⇒ Object
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 |
# File 'lib/flat_kit/command/merge.rb', line 17 def self.parser ::Optimist::Parser.new do Merge.description.to_s "" <<~BANNER Given a set of input files that have the same structure, and are already sorted by a set of keys. The Merge command will merge all those files into a single output file. The --key parameter is required, and it must be a comma separated list of field nams on the input on which to use as the sort key for the merge process. There must also be at least 2 input files. Merging only 1 file into an output file is the same as the 'cat' command. The flatfile type(s) will be automatically determined by the file name. If the output is not a file, but to stdout then the output type will be the same as the first input file, or it can be specified as a commandline switch. The merge will do a single pass through the input to generate the output. BANNER <<~USAGE Usage: fk merge --key surname,given_name file1.csv file2.csv > all.csv fk merge --key surname,given_name --output-format json file1.csv file2.csv > all.json fk merge --key field1,field2 --output-format json input*.csv | gzip -c > all.json.gz fk merge --key field12 file*.json.gz -o all.json.gz USAGE <<~OPTIONS Options: OPTIONS opt :output, "Send the output to the given path instead of standard out.", default: "<stdout>" opt :input_format, "Input format, csv or json", default: "auto", short: :none opt :output_format, "Output format, csv or json", default: "auto", short: :none opt :key, "The comma separted list of field(s) to use for sorting the input", required: true, type: :string end end |
Instance Method Details
#call ⇒ Object
84 85 86 |
# File 'lib/flat_kit/command/merge.rb', line 84 def call @merge.call end |
#parse ⇒ Object
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/flat_kit/command/merge.rb', line 68 def parse parser = self.class.parser ::Optimist.with_standard_exception_handling(parser) do @opts = parser.parse(argv) @compare_keys = CSV.parse_line(opts[:key]) paths = parser.leftovers raise ::Optimist::CommandlineError, "At least 2 input files are required" if paths.size < 2 @merge = ::FlatKit::Merge.new(inputs: paths, input_fallback: opts[:input_format], compare_fields: @compare_keys, output: opts[:output], output_fallback: opts[:output_format]) rescue ::FlatKit::Error => e raise ::Optimist::CommandlineError, e. end end |