csv2sql 0.2.070529155119 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -0
- data/Manifest.txt +9 -0
- data/Rakefile +31 -0
- data/lib/csv2sql.rb +37 -35
- data/tests/files/multilinecells.csv +4 -0
- data/tests/test.rb +5 -2
- metadata +58 -37
- /data/{README → README.txt} +0 -0
data/History.txt
ADDED
data/Manifest.txt
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
|
2
|
+
require 'rubygems'
|
3
|
+
require 'hoe'
|
4
|
+
|
5
|
+
$:.unshift(File.dirname(__FILE__) + "/lib")
|
6
|
+
require 'csv2sql'
|
7
|
+
|
8
|
+
RUBYFORGE_PROJECT = 'csv2sql'
|
9
|
+
|
10
|
+
Hoe.new('Csv2sql', Csv2sql::VERSION) do |p|
|
11
|
+
p.name = RUBYFORGE_PROJECT
|
12
|
+
p.author = "Mirek Rusin"
|
13
|
+
p.email = 'ruby@mirekrusin.com'
|
14
|
+
p.summary = "Csv2sql provides an easy way to convert comma separated files to sql"
|
15
|
+
p.description = "Csv2sql provides an easy way to convert comma separated files to sql"
|
16
|
+
p.url = "http://rubyforge.com/projects/#{RUBYFORGE_PROJECT}"
|
17
|
+
p.clean_globs = ['test/actual'] # Remove this directory on "rake clean"
|
18
|
+
p.remote_rdoc_dir = '' # Release to root
|
19
|
+
p.changes = p.paragraphs_of('CHANGELOG', 0..1).join("\n\n")
|
20
|
+
#p.rsync_args << ' --exclude=statsvn/'
|
21
|
+
# * extra_deps - An array of rubygem dependencies.
|
22
|
+
end
|
23
|
+
|
24
|
+
desc 'Publish RDoc to RubyForge via pscp'
|
25
|
+
task :publish_docs_via_pscp => [:clean, :docs] do
|
26
|
+
config = YAML.load(File.read(File.expand_path("~/.rubyforge/user-config.yml")))
|
27
|
+
sh %{pscp -r doc/* #{config["username"]}@rubyforge.org:/var/www/gforge-projects/#{RUBYFORGE_PROJECT}/}
|
28
|
+
end
|
29
|
+
|
30
|
+
desc "Release and publish documentation"
|
31
|
+
task :default => [:release, :publish_docs_via_pscp]
|
data/lib/csv2sql.rb
CHANGED
@@ -28,14 +28,17 @@ require 'pathname'
|
|
28
28
|
#
|
29
29
|
class Csv2sql
|
30
30
|
|
31
|
+
VERSION = '0.3.1'
|
32
|
+
|
31
33
|
@@defaults = {
|
32
|
-
:before
|
33
|
-
:after
|
34
|
+
:before => "", # can be changed to "start transaction;\n"
|
35
|
+
:after => ";\n" # can be changes to "commit;\n"
|
34
36
|
}
|
35
37
|
|
36
|
-
def self.default_value_filter(v, i, j
|
38
|
+
def self.default_value_filter(v, i=nil, j=nil)
|
37
39
|
return 'null' if v.to_s == ''
|
38
40
|
return v.to_s if v.is_a? Float or v.is_a? Fixnum
|
41
|
+
v.gsub!(/\\/, '\\\\')
|
39
42
|
v.gsub!(/"/, '\\"')
|
40
43
|
"\"#{v}\""
|
41
44
|
end
|
@@ -104,8 +107,10 @@ class Csv2sql
|
|
104
107
|
# :row_format
|
105
108
|
# :row_glue
|
106
109
|
# :after
|
110
|
+
# :when_empty
|
107
111
|
#
|
108
112
|
def to_any(args={})
|
113
|
+
args[:when_empty] ||= ""
|
109
114
|
args[:values_glue] ||= ", "
|
110
115
|
args[:row_format] ||= "%s"
|
111
116
|
args[:row_glue] ||= "\n"
|
@@ -121,48 +126,45 @@ class Csv2sql
|
|
121
126
|
r << args[:row_format].call(values) # LOOK OUT: args[:values_glue] ignored
|
122
127
|
end
|
123
128
|
end
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
129
|
+
if r.size > 0
|
130
|
+
r = r.join args[:row_glue]
|
131
|
+
r = args[:before] + r if args[:before]
|
132
|
+
r = r + args[:after] if args[:after]
|
133
|
+
r
|
134
|
+
else
|
135
|
+
args[:when_empty]
|
136
|
+
end
|
128
137
|
end
|
129
138
|
|
130
139
|
# Parse file
|
131
140
|
#
|
132
|
-
# args[:
|
133
|
-
# args[:
|
141
|
+
# args[:values_filter] - proc, called with (values, line_number)
|
142
|
+
# args[:value_filter] - proc, called with values, line_number, column_number
|
134
143
|
#
|
135
144
|
def parse(args={})
|
136
145
|
args[:value_filter] ||= Csv2sql.method :default_value_filter
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
if args[:value_filter] # LOOK OUT! value_filter is for single value
|
153
|
-
k = -1
|
154
|
-
values = values.map do |value|
|
155
|
-
k += 1
|
156
|
-
args[:value_filter].call(value, i, j, k)
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
yield values if values
|
161
|
-
|
146
|
+
data = open(@filename, 'r').read
|
147
|
+
last_offset = offset = 0
|
148
|
+
i = 0
|
149
|
+
begin
|
150
|
+
values = []
|
151
|
+
last_offset = offset
|
152
|
+
parsed_cells, offset = CSV.parse_row(data, offset, values)
|
153
|
+
# TODO: ignore blank lines? what about single column csv files with blank values?
|
154
|
+
values = args[:values_filter].call(values, i) if args[:values_filter]
|
155
|
+
if values
|
156
|
+
if args[:value_filter] # LOOK OUT! value_filter is for single value, values_filter is for whole row
|
157
|
+
j = -1
|
158
|
+
values = values.map do |value|
|
159
|
+
j += 1
|
160
|
+
args[:value_filter].call(value, i, j)
|
162
161
|
end
|
163
162
|
end
|
163
|
+
yield values if values
|
164
164
|
end
|
165
|
-
|
165
|
+
i += 1
|
166
|
+
end while parsed_cells > 0
|
167
|
+
#raise "Illegal format error in #{@filename} at row starting with the line #{i} (last offset #{offset} not the same as the data size #{data.size})" if offset != data.size
|
166
168
|
end
|
167
169
|
|
168
170
|
end
|
data/tests/test.rb
CHANGED
@@ -1,16 +1,19 @@
|
|
1
1
|
|
2
2
|
require 'test/unit'
|
3
3
|
require '../lib/csv2sql'
|
4
|
+
require 'pp'
|
4
5
|
|
5
6
|
class Csv2sqlTest < Test::Unit::TestCase
|
6
7
|
|
7
8
|
def setup
|
8
9
|
@files_dir = File.dirname(__FILE__) + '/files'
|
9
10
|
@gmclient_file = "#{@files_dir}/gmclient.csv"
|
11
|
+
@multilinecells_file = "#{@files_dir}/multilinecells.csv"
|
10
12
|
end
|
11
13
|
|
12
|
-
def
|
13
|
-
|
14
|
+
def test_multiline_cells
|
15
|
+
r = Csv2sql.new(@multilinecells_file).to_inserts.split /insert into/
|
16
|
+
assert_equal 3, r.size # 2 rows
|
14
17
|
end
|
15
18
|
|
16
19
|
end
|
metadata
CHANGED
@@ -1,51 +1,72 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.0
|
3
|
-
specification_version: 1
|
4
2
|
name: csv2sql
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2007-05-29 00:00:00 +01:00
|
8
|
-
summary: Csv2sql provides an easy way to convert comma separated files to sql
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
email: ruby@mirekrusin.com
|
12
|
-
homepage: http://mirekrusin.com/ruby/csv2sql
|
13
|
-
rubyforge_project:
|
14
|
-
description:
|
15
|
-
autorequire: csv2sql
|
16
|
-
default_executable:
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: true
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.0
|
24
|
-
version:
|
4
|
+
version: 0.3.1
|
25
5
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
|
-
post_install_message:
|
29
6
|
authors:
|
30
7
|
- Mirek Rusin
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
- tests/test.rb
|
35
|
-
- tests/files/gmclient.csv
|
36
|
-
- lib/csv2sql.rb
|
37
|
-
- README
|
38
|
-
test_files: []
|
39
|
-
|
40
|
-
rdoc_options: []
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
41
11
|
|
42
|
-
|
43
|
-
|
12
|
+
date: 2008-07-07 00:00:00 +01:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: hoe
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.6.0
|
23
|
+
version:
|
24
|
+
description: Csv2sql provides an easy way to convert comma separated files to sql
|
25
|
+
email: ruby@mirekrusin.com
|
44
26
|
executables: []
|
45
27
|
|
46
28
|
extensions: []
|
47
29
|
|
30
|
+
extra_rdoc_files:
|
31
|
+
- History.txt
|
32
|
+
- Manifest.txt
|
33
|
+
- README.txt
|
34
|
+
files:
|
35
|
+
- History.txt
|
36
|
+
- Manifest.txt
|
37
|
+
- README.txt
|
38
|
+
- Rakefile
|
39
|
+
- lib/csv2sql.rb
|
40
|
+
- tests/files/gmclient.csv
|
41
|
+
- tests/files/multilinecells.csv
|
42
|
+
- tests/instant.rb
|
43
|
+
- tests/test.rb
|
44
|
+
has_rdoc: true
|
45
|
+
homepage: http://rubyforge.com/projects/csv2sql
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options:
|
48
|
+
- --main
|
49
|
+
- README.txt
|
50
|
+
require_paths:
|
51
|
+
- lib
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: "0"
|
57
|
+
version:
|
58
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: "0"
|
63
|
+
version:
|
48
64
|
requirements: []
|
49
65
|
|
50
|
-
|
66
|
+
rubyforge_project: csv2sql
|
67
|
+
rubygems_version: 1.0.1
|
68
|
+
signing_key:
|
69
|
+
specification_version: 2
|
70
|
+
summary: Csv2sql provides an easy way to convert comma separated files to sql
|
71
|
+
test_files: []
|
51
72
|
|
/data/{README → README.txt}
RENAMED
File without changes
|