csv-autoparser 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -0
- data/lib/csv/autoparser.rb +15 -16
- data/lib/csv/autoparser/version.rb +1 -1
- data/test/fixtures/persons.csv +1 -0
- data/test/fixtures/persons2.csv +3 -0
- data/test/test_csv/autoparser.rb +36 -9
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b806b5d4df47de7532a01384fa357b998e53653a
|
4
|
+
data.tar.gz: 1ad970d72389cb2a061127d69c584ed8be1e0244
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9263abf623d4ffb74ad65ba9243f9fa36e9924ba7787f7c9619bbbf866a3843764ee2f0a1476af6331c16172eed75f948340562c8750ca37b47260b803594b5a
|
7
|
+
data.tar.gz: 07d207dc0bd482d688d721a714bb4caa8527925f521099f47dfe6bb0cf485645811c6d598a572e24eb86f222868909e0246fcf2040d42d9e5f6f63708f3afedc
|
data/README.md
CHANGED
@@ -8,6 +8,8 @@ CSV::AutoParser automatically parses a CSV file given a user specified header ro
|
|
8
8
|
|
9
9
|
## Usage
|
10
10
|
|
11
|
+
require 'csv/autoparser'
|
12
|
+
|
11
13
|
# ID header row by CSV line number.
|
12
14
|
csv = CSV::AutoParser.new("my_file.csv") {|csv_line_number, header_row| csv_line_number == 1 }
|
13
15
|
csv.rows.each {|row| puts row.full_name }
|
data/lib/csv/autoparser.rb
CHANGED
@@ -3,20 +3,13 @@ require "csv/autoparser/version"
|
|
3
3
|
|
4
4
|
class CSV
|
5
5
|
class AutoParser
|
6
|
-
class Row
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
def self.column_to_method_name name
|
15
|
-
name.downcase.strip.gsub(/\s+/, '_').gsub(/-+/, '_').gsub(/[^\w]/, '')
|
16
|
-
end
|
17
|
-
|
18
|
-
def initialize row
|
19
|
-
@row = row
|
7
|
+
class Row < Array
|
8
|
+
attr_reader :csv_file, :csv_line
|
9
|
+
def self.create original_row, file, line
|
10
|
+
row = Row.new(original_row)
|
11
|
+
row.instance_eval { @csv_file = file; @csv_line = line }
|
12
|
+
return row
|
20
13
|
end
|
21
14
|
end
|
22
15
|
|
@@ -34,16 +27,22 @@ class CSV
|
|
34
27
|
if map.empty?
|
35
28
|
if is_header.call(csv_line_number, row)
|
36
29
|
row.each_index {|index| map[row[index]] = index }
|
37
|
-
Row.define_methods(map)
|
38
30
|
else
|
39
|
-
@pre_header_rows << row
|
31
|
+
@pre_header_rows << Row::create(row, file, csv_line_number)
|
40
32
|
end
|
41
33
|
else
|
42
|
-
@rows << Row
|
34
|
+
@rows << Row::create(row, file, csv_line_number)
|
35
|
+
map.each_pair do |column_name, column_offset|
|
36
|
+
@rows.last.define_singleton_method(column_to_method_name(column_name)) { self[column_offset] }
|
37
|
+
end
|
43
38
|
end
|
44
39
|
end
|
45
40
|
raise HeaderRowNotFound, "Could not find header row in #{file}." if map.empty?
|
46
41
|
end
|
47
42
|
|
43
|
+
def column_to_method_name name
|
44
|
+
name.downcase.strip.gsub(/\s+/, '_').gsub(/-+/, '_').gsub(/[^\w]/, '')
|
45
|
+
end
|
46
|
+
|
48
47
|
end
|
49
48
|
end
|
data/test/fixtures/persons.csv
CHANGED
data/test/test_csv/autoparser.rb
CHANGED
@@ -3,18 +3,14 @@ require 'minitest_helper'
|
|
3
3
|
|
4
4
|
describe CSV::AutoParser do
|
5
5
|
|
6
|
-
def input_file
|
7
|
-
fixture_file_path('persons.csv')
|
8
|
-
end
|
9
|
-
|
10
6
|
it "it can parse a csv automatically via csv line number id" do
|
11
|
-
csv = CSV::AutoParser.new(
|
12
|
-
csv.rows.length.must_equal
|
13
|
-
csv.rows.first.full_name.must_equal "
|
7
|
+
csv = CSV::AutoParser.new(fixture_file_path('persons.csv')) {|csv_line_number, header_row| csv_line_number == 1 }
|
8
|
+
csv.rows.length.must_equal 5
|
9
|
+
csv.rows.first.full_name.must_equal "bob"
|
14
10
|
end
|
15
11
|
|
16
12
|
it "it can parse a csv automatically via header row id" do
|
17
|
-
csv = CSV::AutoParser.new(
|
13
|
+
csv = CSV::AutoParser.new(fixture_file_path('persons.csv')) do |line_num, header_row|
|
18
14
|
["name", "Job title"].all? {|cell| header_row.include?(cell) }
|
19
15
|
end
|
20
16
|
csv.rows.length.must_equal 3
|
@@ -23,9 +19,40 @@ describe CSV::AutoParser do
|
|
23
19
|
csv.rows.last.age.to_i.must_equal 29
|
24
20
|
end
|
25
21
|
|
22
|
+
it "it will give you the rows found before the header row" do
|
23
|
+
csv = CSV::AutoParser.new(fixture_file_path('persons.csv')) do |line_num, header_row|
|
24
|
+
["name", "Job title"].all? {|cell| header_row.include?(cell) }
|
25
|
+
end
|
26
|
+
csv.pre_header_rows.first.last.must_equal "years of age"
|
27
|
+
csv.pre_header_rows.last.first.must_equal "bob"
|
28
|
+
File.basename(csv.pre_header_rows.last.csv_file).must_equal "persons.csv"
|
29
|
+
csv.pre_header_rows.last.csv_line.must_equal 2
|
30
|
+
end
|
31
|
+
|
26
32
|
it "will raise an exception if it can't find the header row" do
|
27
|
-
lambda { CSV::AutoParser.new(
|
33
|
+
lambda { CSV::AutoParser.new(fixture_file_path('persons.csv')) {|csv_line_number, header_row| csv_line_number == 0 }}.
|
28
34
|
must_raise(CSV::AutoParser::HeaderRowNotFound)
|
29
35
|
end
|
30
36
|
|
37
|
+
it "will not confuse column information with another csv which is parsed simultaneously" do
|
38
|
+
csv = CSV::AutoParser.new(fixture_file_path('persons.csv')) do |line_num, header_row|
|
39
|
+
["name", "Job title"].all? {|cell| header_row.include?(cell) }
|
40
|
+
end
|
41
|
+
csv2 = CSV::AutoParser.new(fixture_file_path('persons2.csv')) do |line_num, header_row|
|
42
|
+
["name", "Job title"].all? {|cell| header_row.include?(cell) }
|
43
|
+
end
|
44
|
+
csv.rows.length.must_equal 3
|
45
|
+
csv.rows.first.name.must_equal "Jon Smith"
|
46
|
+
csv.rows.first.job_title.must_equal "blacksmith"
|
47
|
+
csv.rows.last.age.to_i.must_equal 29
|
48
|
+
csv.rows[1].job_title.must_equal "farmer"
|
49
|
+
csv.rows[1].csv_line.must_equal 5
|
50
|
+
|
51
|
+
csv2.rows.length.must_equal 2
|
52
|
+
csv2.rows.first.name.must_equal "Kermy Frog"
|
53
|
+
csv2.rows.first.job_title.must_equal "frog"
|
54
|
+
csv2.rows.last.age.to_i.must_equal 19
|
55
|
+
File.basename(csv2.rows.first.csv_file).must_equal "persons2.csv"
|
56
|
+
end
|
57
|
+
|
31
58
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: csv-autoparser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Delsol
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -52,6 +52,7 @@ files:
|
|
52
52
|
- lib/csv/autoparser.rb
|
53
53
|
- lib/csv/autoparser/version.rb
|
54
54
|
- test/fixtures/persons.csv
|
55
|
+
- test/fixtures/persons2.csv
|
55
56
|
- test/minitest_helper.rb
|
56
57
|
- test/test_csv/autoparser.rb
|
57
58
|
homepage: ''
|
@@ -80,5 +81,6 @@ specification_version: 4
|
|
80
81
|
summary: Can parse a CSV file automatically given a user specified header row.
|
81
82
|
test_files:
|
82
83
|
- test/fixtures/persons.csv
|
84
|
+
- test/fixtures/persons2.csv
|
83
85
|
- test/minitest_helper.rb
|
84
86
|
- test/test_csv/autoparser.rb
|