excel2csv 0.0.7 → 0.0.8
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.
- data/README.md +5 -5
- data/lib/excel2csv/info.rb +42 -0
- data/lib/excel2csv/version.rb +1 -1
- data/lib/excel2csv.rb +11 -52
- data/spec/excel2csv_spec.rb +12 -12
- metadata +4 -3
data/README.md
CHANGED
@@ -34,12 +34,12 @@ Excel2CSV.foreach("path/to/file.xls") {|r| puts r}
|
|
34
34
|
Excel2CSV.foreach("path/to/file.xlsx") {|r| puts r}
|
35
35
|
|
36
36
|
# Read non first worksheet
|
37
|
-
Excel2CSV.read "path/to/file.xls",
|
38
|
-
Excel2CSV.read "path/to/file.xlsx",
|
37
|
+
Excel2CSV.read "path/to/file.xls", sheet:1 #reads second sheet
|
38
|
+
Excel2CSV.read "path/to/file.xlsx", sheet:2 #reads third sheet
|
39
39
|
|
40
40
|
|
41
41
|
# Preview first N rows in big files
|
42
|
-
Excel2CSV.read "path/to/file.xls",
|
43
|
-
Excel2CSV.read "path/to/file.xlsx",
|
44
|
-
Excel2CSV.read "path/to/file.csv",
|
42
|
+
Excel2CSV.read "path/to/file.xls", rows: 2, preview: true
|
43
|
+
Excel2CSV.read "path/to/file.xlsx", rows: 2, preview: true
|
44
|
+
Excel2CSV.read "path/to/file.csv", rows: 2, preview: true
|
45
45
|
```
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
|
3
|
+
module Excel2CSV
|
4
|
+
class Info
|
5
|
+
attr_accessor :sheets
|
6
|
+
attr_accessor :previews
|
7
|
+
attr_accessor :working_folder
|
8
|
+
|
9
|
+
def self.read working_folder
|
10
|
+
info = Info.new working_folder
|
11
|
+
info.read
|
12
|
+
info
|
13
|
+
end
|
14
|
+
|
15
|
+
def read
|
16
|
+
Dir["#{@working_folder}/*.csv"].map do |file|
|
17
|
+
name = File.basename(file)
|
18
|
+
m = /(?<sheet>\d+)-(?<rows>\d+)(-of-(?<total_rows>\d+))?/.match(name)
|
19
|
+
next if !m
|
20
|
+
total_rows = (m[:total_rows] || m[:rows]).to_i
|
21
|
+
preview_rows = m[:rows].to_i
|
22
|
+
if name =~ /preview/
|
23
|
+
@previews << {path: file, total_rows:total_rows, rows:preview_rows}
|
24
|
+
else
|
25
|
+
@sheets << {path: file, total_rows:total_rows, rows:total_rows}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def clean
|
31
|
+
FileUtils.remove_entry_secure(@working_folder, true) if @working_folder
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def initialize working_folder
|
37
|
+
@working_folder = working_folder
|
38
|
+
@sheets = []
|
39
|
+
@previews = []
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/excel2csv/version.rb
CHANGED
data/lib/excel2csv.rb
CHANGED
@@ -1,51 +1,10 @@
|
|
1
1
|
require "excel2csv/version"
|
2
|
+
require "excel2csv/info"
|
3
|
+
|
2
4
|
require "csv"
|
3
5
|
require "tmpdir"
|
4
|
-
require "fileutils"
|
5
6
|
|
6
7
|
module Excel2CSV
|
7
|
-
|
8
|
-
class Info
|
9
|
-
attr_accessor :sheets
|
10
|
-
attr_accessor :previews
|
11
|
-
attr_accessor :tmp_dir
|
12
|
-
attr_accessor :working_dir
|
13
|
-
|
14
|
-
def self.read dir, tmp_dir
|
15
|
-
info = Info.new dir, tmp_dir
|
16
|
-
info.read
|
17
|
-
info
|
18
|
-
end
|
19
|
-
|
20
|
-
def read
|
21
|
-
Dir["#{@working_dir}/*.csv"].map do |file|
|
22
|
-
name = File.basename(file)
|
23
|
-
m = /(?<sheet>\d+)-(?<rows>\d+)(-of-(?<total_rows>\d+))?/.match(name)
|
24
|
-
next if !m
|
25
|
-
total_rows = (m[:total_rows] || m[:rows]).to_i
|
26
|
-
preview_rows = m[:rows].to_i
|
27
|
-
if name =~ /preview/
|
28
|
-
@previews << {path: file, total_rows:total_rows, rows:preview_rows}
|
29
|
-
else
|
30
|
-
@sheets << {path: file, total_rows:total_rows, rows:total_rows}
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def clean
|
36
|
-
FileUtils.remove_entry_secure(@tmp_dir, true) if @tmp_dir
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
def initialize working_dir, tmp_dir
|
42
|
-
@working_dir = working_dir
|
43
|
-
@tmp_dir = tmp_dir
|
44
|
-
@sheets = []
|
45
|
-
@previews = []
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
49
8
|
|
50
9
|
def foreach(path, options = {}, &block)
|
51
10
|
convert(path, options) do |info|
|
@@ -65,7 +24,7 @@ module Excel2CSV
|
|
65
24
|
|
66
25
|
def convert(path, options = {})
|
67
26
|
info = options[:info]
|
68
|
-
if info && Dir.exists?(info.
|
27
|
+
if info && Dir.exists?(info.working_folder)
|
69
28
|
return block_given? ? yield(info) : info
|
70
29
|
end
|
71
30
|
begin
|
@@ -89,7 +48,7 @@ module Excel2CSV
|
|
89
48
|
else
|
90
49
|
collection = info.sheets
|
91
50
|
end
|
92
|
-
index = (idx = options[:
|
51
|
+
index = (idx = options[:sheet]) ? idx : 0
|
93
52
|
collection[index][:path]
|
94
53
|
end
|
95
54
|
|
@@ -97,8 +56,8 @@ module Excel2CSV
|
|
97
56
|
|
98
57
|
def create_cvs_files(path, options)
|
99
58
|
tmp_dir = Dir.mktmpdir
|
100
|
-
|
101
|
-
limit = options[:
|
59
|
+
working_folder = options[:working_folder] || tmp_dir
|
60
|
+
limit = options[:rows]
|
102
61
|
if path =~ /\.csv$/
|
103
62
|
total_rows = 0
|
104
63
|
preview_rows = []
|
@@ -106,7 +65,7 @@ module Excel2CSV
|
|
106
65
|
|
107
66
|
# Transcode file to utf-8, count total and gen preview
|
108
67
|
|
109
|
-
CSV.open("#{
|
68
|
+
CSV.open("#{working_folder}/1-#{total_rows}.csv", "wb") do |csv|
|
110
69
|
CSV.foreach(path, opts) do |row|
|
111
70
|
if limit && total_rows <= limit
|
112
71
|
preview_rows << row
|
@@ -117,7 +76,7 @@ module Excel2CSV
|
|
117
76
|
end
|
118
77
|
|
119
78
|
if limit
|
120
|
-
CSV.open("#{
|
79
|
+
CSV.open("#{working_folder}/1-#{limit}-of-#{total_rows}-preview.csv", "wb") do |csv|
|
121
80
|
preview_rows.each {|row| csv << row}
|
122
81
|
end
|
123
82
|
end
|
@@ -125,17 +84,17 @@ module Excel2CSV
|
|
125
84
|
java_options = options[:java_options] || "-Dfile.encoding=utf8 -Xms512m -Xmx512m -XX:MaxPermSize=256m"
|
126
85
|
rows_limit = limit ? "-r #{limit}" : ""
|
127
86
|
jar_path = File.join(File.dirname(__FILE__), "excel2csv.jar")
|
128
|
-
`java #{java_options} -jar #{jar_path} #{rows_limit} #{path} #{
|
87
|
+
`java #{java_options} -jar #{jar_path} #{rows_limit} #{path} #{working_folder}`
|
129
88
|
end
|
130
89
|
|
131
|
-
Info.read(
|
90
|
+
Info.read(working_folder)
|
132
91
|
end
|
133
92
|
|
134
93
|
module_function :create_cvs_files
|
135
94
|
|
136
95
|
def clean_options options
|
137
96
|
options.dup.delete_if do |key, value|
|
138
|
-
[:
|
97
|
+
[:working_folder, :java_options, :preview, :sheet, :path, :rows, :info].include?(key)
|
139
98
|
end
|
140
99
|
end
|
141
100
|
|
data/spec/excel2csv_spec.rb
CHANGED
@@ -35,31 +35,31 @@ describe Excel2CSV do
|
|
35
35
|
count.should == 3
|
36
36
|
end
|
37
37
|
|
38
|
-
it "removes tmp
|
39
|
-
|
38
|
+
it "removes tmp folder after work" do
|
39
|
+
working_folder = nil
|
40
40
|
excel.convert xlsx_basic_types do |info|
|
41
41
|
# puts IO.read(info.sheets.first[:path])
|
42
|
-
|
42
|
+
working_folder = info.working_folder
|
43
43
|
end
|
44
|
-
|
45
|
-
Dir.exists?(
|
44
|
+
working_folder.should_not be_nil
|
45
|
+
Dir.exists?(working_folder).should == false
|
46
46
|
end
|
47
47
|
|
48
48
|
it "converts once if info is passed" do
|
49
49
|
info = excel.convert xlsx_basic_types
|
50
50
|
info.sheets.length.should == 1
|
51
51
|
info.previews.length.should == 0
|
52
|
-
info.should == excel.convert(
|
52
|
+
info.should == excel.convert(xlsx_basic_types, info:info)
|
53
53
|
end
|
54
54
|
|
55
|
-
it "regenerate csv files if
|
55
|
+
it "regenerate csv files if working_folder is removed" do
|
56
56
|
info = excel.convert xlsx_basic_types
|
57
57
|
info.clean
|
58
58
|
info.should_not == excel.convert(xlsx_basic_types, info:info)
|
59
59
|
end
|
60
60
|
|
61
61
|
it "generates preview csv files with rows limit" do
|
62
|
-
info = excel.convert xls_basic_types,
|
62
|
+
info = excel.convert xls_basic_types, rows:1
|
63
63
|
info.sheets.length.should == 1
|
64
64
|
info.previews.length.should == 1
|
65
65
|
|
@@ -71,7 +71,7 @@ describe Excel2CSV do
|
|
71
71
|
end
|
72
72
|
|
73
73
|
it "reads previews" do
|
74
|
-
data = excel.read(xls_basic_types,
|
74
|
+
data = excel.read(xls_basic_types, rows:1, preview:true, sheet:0)
|
75
75
|
data.length.should == 1
|
76
76
|
data[0].should == ["1.00", date_24, "Hello"]
|
77
77
|
end
|
@@ -85,9 +85,9 @@ describe Excel2CSV do
|
|
85
85
|
|
86
86
|
it "reads csv files with preview" do
|
87
87
|
data = excel.read(csv_basic_types,
|
88
|
-
encoding:
|
89
|
-
|
90
|
-
preview:
|
88
|
+
encoding: 'windows-1251:utf-8',
|
89
|
+
rows: 2,
|
90
|
+
preview: true
|
91
91
|
)
|
92
92
|
data[0].should == ["1.00","12/24/11 12:00 AM","Hello"]
|
93
93
|
data[1].should == ["2.00","12/25/11 12:00 AM","Привет"]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: excel2csv
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2011-09-26 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &70115224571500 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - <=
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: '2.6'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70115224571500
|
25
25
|
description: gem for converting Excel files to csv
|
26
26
|
email:
|
27
27
|
- yury.korolev@gmail.com
|
@@ -36,6 +36,7 @@ files:
|
|
36
36
|
- excel2csv.gemspec
|
37
37
|
- lib/excel2csv.jar
|
38
38
|
- lib/excel2csv.rb
|
39
|
+
- lib/excel2csv/info.rb
|
39
40
|
- lib/excel2csv/version.rb
|
40
41
|
- spec/excel2csv_spec.rb
|
41
42
|
- spec/fixtures/basic_types.csv
|