fixed_width_file_parser 0.1.0
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 +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/README.md +52 -0
- data/Rakefile +3 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/fixed_width_file_parser.gemspec +23 -0
- data/lib/fixed_width_file_parser/version.rb +3 -0
- data/lib/fixed_width_file_parser.rb +63 -0
- data/lib/tasks/rspec.rake +3 -0
- metadata +97 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3455ef0663d655e5f0e6961429d6a3aa69eae6a0
|
4
|
+
data.tar.gz: fdf7ab1baa2f5047f8d9720b42c659a0c9276dba
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8ed8bf0c4ff9214fb096c43c0df00f2b2a446232a4459538f947f6fbd8d903921375a1c5e161072cc7eff82486821a3321e348e1f3c06fc6954d16d39f8fab46
|
7
|
+
data.tar.gz: f5808f8824d113cde29ecb1b24503050cbe39550ce47b8cb9a7ed9952c3095219b516d11800dacc4b7ade542643d9a29fa931734869f7beb3e9eaa4d405ffeba
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
# FixedWidthFileParser
|
2
|
+
|
3
|
+
FixedWidthFileParser is used to parse fixed width files. Crazy right?
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'fixed_width_file_parser'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install fixed_width_file_parser
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
In order to parse a fixed width file, you need to define the fields (and their positions) as well as the filepath, and then pass those to a block that will yield the data for each row.
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
filepath = 'path/to/file.txt'
|
27
|
+
fields = [
|
28
|
+
{ name: 'first_name', position: 0..10 },
|
29
|
+
{ name: 'middle_initial', position: 11 },
|
30
|
+
{ name: 'last_name', position: 12..25 }
|
31
|
+
]
|
32
|
+
|
33
|
+
FixedWidthFileParser.parse(filepath, fields) do |row|
|
34
|
+
puts row[:first_name]
|
35
|
+
puts row[:middle_initial]
|
36
|
+
puts row[:last_name]
|
37
|
+
end
|
38
|
+
```
|
39
|
+
|
40
|
+
## Development
|
41
|
+
|
42
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
|
43
|
+
|
44
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
45
|
+
|
46
|
+
## Contributing
|
47
|
+
|
48
|
+
1. Fork it ( https://github.com/elevatorup/fixed_width_file_parser/fork )
|
49
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
50
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
51
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
52
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "fixed_width_file_parser"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'fixed_width_file_parser/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "fixed_width_file_parser"
|
8
|
+
spec.version = FixedWidthFileParser::VERSION
|
9
|
+
spec.authors = ["Jim Smith"]
|
10
|
+
spec.email = ["jim@jimsmithdesign.com"]
|
11
|
+
|
12
|
+
spec.summary = "Parse fixed width files easily and efficiently."
|
13
|
+
spec.homepage = "https://github.com/elevatorup/fixed_width_file_parser"
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
16
|
+
spec.bindir = "exe"
|
17
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_development_dependency "bundler", "~> 1.8"
|
21
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
22
|
+
spec.add_development_dependency 'rspec'
|
23
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require "fixed_width_file_parser/version"
|
2
|
+
|
3
|
+
module FixedWidthFileParser
|
4
|
+
# Parse a fixed width file, yielding the proper data for each line based on the fields passed in
|
5
|
+
#
|
6
|
+
# @param filepath [String] The path to the file to be parsed.
|
7
|
+
# @param fields [Array(Hash{name => String, position => Range|Integer})] An array of field hashes, each containing a `name` and a `position`.
|
8
|
+
# @yield [Hash] Yields a hash object based on the fields provided.
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# filepath = 'path/to/file'
|
12
|
+
# fields = [
|
13
|
+
# { name: 'first_name', position: 0..10 },
|
14
|
+
# { name: 'middle_initial', position: 11 },
|
15
|
+
# { name: 'last_name', position: 12..25 }
|
16
|
+
# ]
|
17
|
+
#
|
18
|
+
# FixedWidthFileParser.parse(filepath, fields) do |row|
|
19
|
+
# puts row
|
20
|
+
# end
|
21
|
+
|
22
|
+
def self.parse(filepath, fields)
|
23
|
+
# Verify `filepath` is a String
|
24
|
+
unless filepath.is_a?(String)
|
25
|
+
raise '`filepath` must be a String'
|
26
|
+
end
|
27
|
+
|
28
|
+
# Verify `fields` is an array
|
29
|
+
if fields.is_a?(Array)
|
30
|
+
# Verify fields is not emtpy
|
31
|
+
if fields.empty?
|
32
|
+
raise '`fields` must contain at least 1 item'
|
33
|
+
end
|
34
|
+
else
|
35
|
+
raise '`fields` must be an Array'
|
36
|
+
end
|
37
|
+
|
38
|
+
# Verify each field has a `name` and `position`
|
39
|
+
unless fields.all? { |item| item.key?(:name) && item.key?(:position) }
|
40
|
+
raise 'Each field hash must include a `name` and a `position`'
|
41
|
+
end
|
42
|
+
|
43
|
+
# Verify that each `position` is either a Range or an Integer
|
44
|
+
unless fields.all? { |item| item[:position].is_a?(Range) || item[:position].is_a?(Integer) }
|
45
|
+
raise "Each field's `position` must be a Range or an Integer"
|
46
|
+
end
|
47
|
+
|
48
|
+
file = File.open(filepath)
|
49
|
+
|
50
|
+
while !file.eof?
|
51
|
+
line = file.readline
|
52
|
+
|
53
|
+
line_fields = {}
|
54
|
+
fields.each do |field|
|
55
|
+
line_fields[field[:name].to_sym] = line[ field[:position] ].strip
|
56
|
+
end
|
57
|
+
|
58
|
+
yield(line_fields)
|
59
|
+
end
|
60
|
+
|
61
|
+
file.close
|
62
|
+
end
|
63
|
+
end
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fixed_width_file_parser
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jim Smith
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-06-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.8'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.8'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description:
|
56
|
+
email:
|
57
|
+
- jim@jimsmithdesign.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- ".gitignore"
|
63
|
+
- ".rspec"
|
64
|
+
- ".travis.yml"
|
65
|
+
- Gemfile
|
66
|
+
- README.md
|
67
|
+
- Rakefile
|
68
|
+
- bin/console
|
69
|
+
- bin/setup
|
70
|
+
- fixed_width_file_parser.gemspec
|
71
|
+
- lib/fixed_width_file_parser.rb
|
72
|
+
- lib/fixed_width_file_parser/version.rb
|
73
|
+
- lib/tasks/rspec.rake
|
74
|
+
homepage: https://github.com/elevatorup/fixed_width_file_parser
|
75
|
+
licenses: []
|
76
|
+
metadata: {}
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options: []
|
79
|
+
require_paths:
|
80
|
+
- lib
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
requirements: []
|
92
|
+
rubyforge_project:
|
93
|
+
rubygems_version: 2.4.6
|
94
|
+
signing_key:
|
95
|
+
specification_version: 4
|
96
|
+
summary: Parse fixed width files easily and efficiently.
|
97
|
+
test_files: []
|