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 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