Class: IOStreams::Tabular::Parser::Fixed
- Defined in:
- lib/io_streams/tabular/parser/fixed.rb
Overview
Parsing and rendering fixed length data
Defined Under Namespace
Instance Attribute Summary collapse
-
#layout ⇒ Object
readonly
Returns the value of attribute layout.
-
#truncate ⇒ Object
readonly
Returns the value of attribute truncate.
Instance Method Summary collapse
-
#initialize(layout:, truncate: true) ⇒ Fixed
constructor
Returns [IOStreams::Tabular::Parser].
-
#line_length ⇒ Object
The required line length for every fixed length line.
-
#parse(line) ⇒ Object
Returns [Hash<Symbol, String>] fixed layout values extracted from the supplied line.
-
#render(row, header) ⇒ Object
Returns [String] fixed layout values extracted from the supplied hash.
-
#requires_header? ⇒ Boolean
The header is required as an argument and cannot be supplied in the file itself.
Constructor Details
#initialize(layout:, truncate: true) ⇒ Fixed
Returns [IOStreams::Tabular::Parser]
Parameters:
layout: [Array<Hash>]
[
{size: 23, key: "name"},
{size: 40, key: "address"},
{size: 2},
{size: 5, key: "zip"},
{size: 8, key: "age", type: :integer},
{size: 10, key: "weight", type: :float, decimals: 2}
]
Notes:
-
Leave out the name of the key to ignore that column during parsing, and to space fill when rendering. For example as a filler.
Types:
:string
This is the default type.
Applies space padding and the value is left justified.
Returns value as a String
:integer
Applies zero padding to the left.
Returns value as an Integer
Raises Errors::ValueTooLong when the supplied value cannot be rendered in `size` characters.
:float
Applies zero padding to the left.
Returns value as a float.
The :size is the total size of this field including the `.` and the decimals.
Number of :decimals
Raises Errors::ValueTooLong when the supplied value cannot be rendered in `size` characters.
In some circumstances the length of the last column is variable.
layout: [Array<Hash>]
[
{size: 23, key: "name"},
{size: :remainder, key: "rest"}
]
By setting a size of :remainder it will take the rest of the line as the value for that column.
A size of :remainder and no :key will discard the remainder of the line without validating the length.
layout: [Array<Hash>]
[
{size: 23, key: "name"},
{size: :remainder}
]
56 57 58 59 |
# File 'lib/io_streams/tabular/parser/fixed.rb', line 56 def initialize(layout:, truncate: true) @layout = Layout.new(layout) @truncate = truncate end |
Instance Attribute Details
#layout ⇒ Object (readonly)
Returns the value of attribute layout.
6 7 8 |
# File 'lib/io_streams/tabular/parser/fixed.rb', line 6 def layout @layout end |
#truncate ⇒ Object (readonly)
Returns the value of attribute truncate.
6 7 8 |
# File 'lib/io_streams/tabular/parser/fixed.rb', line 6 def truncate @truncate end |
Instance Method Details
#line_length ⇒ Object
The required line length for every fixed length line
62 63 64 |
# File 'lib/io_streams/tabular/parser/fixed.rb', line 62 def line_length layout.length end |
#parse(line) ⇒ Object
Returns [Hash<Symbol, String>] fixed layout values extracted from the supplied line. String will be encoded to encoding
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/io_streams/tabular/parser/fixed.rb', line 83 def parse(line) unless line.is_a?(String) raise(Errors::TypeMismatch, "Line must be a String when format is :fixed. Actual: #{line.class.name}") end if layout.length.positive? && (line.length != layout.length) raise(Errors::InvalidLineLength, "Expected line length: #{layout.length}, actual line length: #{line.length}") end hash = {} index = 0 layout.columns.each do |column| if column.size == -1 hash[column.key] = column.parse(line[index..-1]) if column.key break end # Ignore "columns" that have no keys. E.g. Fillers hash[column.key] = column.parse(line[index, column.size]) if column.key index += column.size end hash end |
#render(row, header) ⇒ Object
Returns [String] fixed layout values extracted from the supplied hash.
Notes:
-
A nil value is considered an empty string
-
When a supplied value exceeds the column size it is truncated.
71 72 73 74 75 76 77 78 79 |
# File 'lib/io_streams/tabular/parser/fixed.rb', line 71 def render(row, header) hash = header.to_hash(row) result = "" layout.columns.each do |column| result << column.render(hash[column.key], truncate) end result end |
#requires_header? ⇒ Boolean
The header is required as an argument and cannot be supplied in the file itself.
108 109 110 |
# File 'lib/io_streams/tabular/parser/fixed.rb', line 108 def requires_header? false end |