csv2sql 0.2.070529155119 → 0.3.1
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/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
|