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 ADDED
@@ -0,0 +1,4 @@
1
+
2
+ === 0.3.0 / 2008-07-07
3
+
4
+ * new gem, rdoc public
data/Manifest.txt ADDED
@@ -0,0 +1,9 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ lib/csv2sql.rb
6
+ tests/files/gmclient.csv
7
+ tests/files/multilinecells.csv
8
+ tests/instant.rb
9
+ tests/test.rb
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 => "", # can be changed to "start transaction;\n"
33
- :after => ";\n" # can be changes to "commit;\n"
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, k)
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
- r = r.join args[:row_glue]
125
- r = args[:before] + r if args[:before]
126
- r = r + args[:after] if args[:after]
127
- r
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[:csv_line_filter] - proc, called with (line, line_number)
133
- # args[:values_filter] - proc, called with (values, csv_line_number, filtered_line_number)
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
- i = j = 0
139
- File.open(@filename, 'r').each_line do |line|
140
- i += 1
141
- line = args[:csv_line_filter].call(line, i) if args[:csv_line_filter]
142
- if line
143
- j += 1
144
- unless values = CSV.parse_line(line)
145
- raise "ERROR:#{@filename}:#{i}:#{j} #{line}"
146
- else
147
-
148
- values = args[:values_filter].call(values, i, j) if args[:values_filter]
149
-
150
- if values
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
- end
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
@@ -0,0 +1,4 @@
1
+ DM,"Antrim
2
+ Mansions
3
+ ",0199S
4
+ WO,"Demo Block",0000S
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 test_to_inserts()
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.2.070529155119
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
- files:
32
- - tests/files
33
- - tests/instant.rb
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
- extra_rdoc_files:
43
- - README
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
- dependencies: []
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
 
File without changes