json2csv 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 191926f29082349e752f721279ded4d00913f675
4
- data.tar.gz: 66247e0ecc895a6b5c727987917ff2c9143e8bc7
3
+ metadata.gz: bde3bd18b5a618adf8726f451417568341559b05
4
+ data.tar.gz: 6c5a12445f165ec69288e854c2a4a14dd74c90f1
5
5
  SHA512:
6
- metadata.gz: 37e2b307419c07c3b23d2936e776d8b44184f54805af39adca4ed95e19aee1d0d9d5bf121d775ef7d220a1e0cfb6a1fac6f1934bdb1a0811c20eafdc9340574e
7
- data.tar.gz: 7611e767213416401db6c7f38ed25340641d24332004d197c0455700a612da269b59095a349c51e82fc4950cfe896fa15241c381dea566d5ca61cfbbca0a148f
6
+ metadata.gz: 46d4a50652f7052216e1898bce79a9783cd08c4a13ab2a9a260422e22002e7a7ec3ad21a962d3814612d2f8eb43b11b130a29c916edaa34ef521e4de1efa52e0
7
+ data.tar.gz: 5456480f5408f730e17ce3b08ad8dc6d3735ba24e5173f789b1fc1c765c6967113b90ae3dd8d2fd3f4e26c043d1a5b6362d4c60656d1a31f24bdb5a6f31c4cc5
data/.gemspec CHANGED
@@ -31,6 +31,7 @@ Gem::Specification.new do |s|
31
31
 
32
32
  s.add_development_dependency 'coveralls', '~> 0.7', '>= 0.7.0r'
33
33
  s.add_development_dependency 'rspec', '~> 3.0', '>= 3.0.0'
34
+ s.add_development_dependency 'ruby-debug-ide' if RUBY_VERSION >= '2.1'
34
35
  s.add_development_dependency 'rubocop', '~> 0.24', '>= 0.24.0'
35
36
  s.add_development_dependency 'simplecov', '~> 0.8', '>= 0.8.2'
36
37
  end
data/README.md CHANGED
@@ -12,3 +12,63 @@ Simple tool for converting JSON to CSV
12
12
  ```
13
13
  gem install json2csv
14
14
  ```
15
+
16
+ ## Usage
17
+
18
+ ```
19
+ json2csv convert data/sample.json
20
+ ```
21
+
22
+ ## Example
23
+
24
+
25
+ *Input json*
26
+
27
+ ```
28
+ cat data/sample.json
29
+
30
+ {
31
+ "12345": {
32
+ "Firstname": "Joe",
33
+ "Lastname": "Doe",
34
+ "Address": {
35
+ "Street": "#2140 Taylor Street, 94133",
36
+ "City": "San Francisco",
37
+ "Details": {
38
+ "note": "Pool available"
39
+ }
40
+ }
41
+ },
42
+
43
+ "45678": {
44
+ "Firstname": "Jack",
45
+ "Lastname": "Plumber",
46
+ "Address": {
47
+ "Street": "#111 Sutter St, 94104",
48
+ "City": "San Francisco",
49
+ "Details": {
50
+ "note": "Korean Close close main entrance"
51
+ }
52
+ }
53
+ }
54
+ }
55
+ ```
56
+
57
+ *Convert json*
58
+
59
+ ```
60
+ ./bin/json2csv convert data/sample.json
61
+ Converting data/sample.json
62
+
63
+ ```
64
+
65
+ *Output json*
66
+
67
+ ```
68
+ cat data/sample.json.csv
69
+
70
+ id,Firstname,Lastname,Address.Street,Address.City,Address.Details.note
71
+ 12345,Joe,Doe,"#2140 Taylor Street, 94133",San Francisco,Pool available
72
+ 45678,Jack,Plumber,"#111 Sutter St, 94104",San Francisco,Korean Close close main entrance
73
+
74
+ ```
data/Rakefile CHANGED
@@ -36,7 +36,7 @@ namespace :test do
36
36
 
37
37
  desc "Run coding style tests"
38
38
  RSpec::Core::RakeTask.new(:cop) do |t|
39
- Rake::Task['cop'].invoke
39
+ # Rake::Task['cop'].invoke
40
40
  end
41
41
 
42
42
  task :all => [:unit, :cop]
data/data/sample.json CHANGED
@@ -3,8 +3,23 @@
3
3
  "Firstname": "Joe",
4
4
  "Lastname": "Doe",
5
5
  "Address": {
6
- "Street": "#123 Happy Street",
7
- "City": "San Francisco"
6
+ "Street": "#2140 Taylor Street, 94133",
7
+ "City": "San Francisco",
8
+ "Details": {
9
+ "note": "Pool available"
10
+ }
11
+ }
12
+ },
13
+
14
+ "45678": {
15
+ "Firstname": "Jack",
16
+ "Lastname": "Plumber",
17
+ "Address": {
18
+ "Street": "#111 Sutter St, 94104",
19
+ "City": "San Francisco",
20
+ "Details": {
21
+ "note": "Korean Close close main entrance"
22
+ }
8
23
  }
9
24
  }
10
25
  }
@@ -22,6 +22,34 @@ module Json2Csv
22
22
  end
23
23
  end
24
24
 
25
+ def get_keys(obj, prefix = nil)
26
+ keys = obj.keys
27
+ res = keys.map do |key|
28
+ val = obj[key]
29
+ sanitized_key = sanitize_key(key)
30
+ if val.is_a?(Hash)
31
+ full_prefix = prefix ? "#{prefix}.#{sanitized_key}" : sanitized_key
32
+ get_keys(val, full_prefix)
33
+ else
34
+ if prefix && !prefix.nil?
35
+ "#{prefix}.#{sanitized_key}"
36
+ else
37
+ sanitized_key
38
+ end
39
+ end
40
+ end
41
+
42
+ res.compact.flatten
43
+ end
44
+
45
+ def get_value(obj, path)
46
+ segments = path.split('.')
47
+ segments.each do |segment|
48
+ obj = obj[segment]
49
+ end
50
+ obj
51
+ end
52
+
25
53
  def load_file(path)
26
54
  # Load input file
27
55
  raw = IO.read(path)
@@ -41,11 +69,9 @@ module Json2Csv
41
69
  end
42
70
 
43
71
  def process(json, out_path = 'out.txt')
44
- # json = json[json.keys.first]
45
-
46
72
  keys = json.keys
47
73
 
48
- first = true # Flag indicating if we already written the "header"
74
+ header = nil
49
75
 
50
76
  # Open the CSV for write
51
77
  CSV.open(out_path, 'wt') do |csv|
@@ -53,20 +79,21 @@ module Json2Csv
53
79
  keys.each do |key|
54
80
  obj = json[key]
55
81
 
56
- # Write header if needed
57
- csv << obj.keys && first = false if first
82
+ if header.nil?
83
+ header = get_keys(obj)
84
+ csv << ['id'] + header
85
+ end
58
86
 
59
87
  # Write row to output CSV
60
- csv << process_row(obj)
88
+ csv << process_row(obj, key, header)
61
89
  end
62
90
  end
63
91
  end
64
92
 
65
- def process_row(obj)
66
- # Create empty array containing all values from this object/row
67
- obj.keys.map do |subkey|
93
+ def process_row(obj, id, header)
94
+ [id] + header.map do |subkey|
68
95
  # Assing value/attribute to temp variable
69
- tmp = obj[subkey]
96
+ tmp = get_value(obj, subkey)
70
97
 
71
98
  # Make temp variable empty string if null
72
99
  tmp = '' if tmp.nil?
@@ -76,6 +103,10 @@ module Json2Csv
76
103
  tmp
77
104
  end
78
105
  end
106
+
107
+ def sanitize_key(key)
108
+ key
109
+ end
79
110
  end
80
111
  end
81
112
  end
@@ -2,5 +2,5 @@
2
2
 
3
3
  # Apollon module
4
4
  module Json2Csv
5
- VERSION = '0.0.1'
5
+ VERSION = '0.0.2'
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json2csv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomas Korcak
@@ -138,6 +138,20 @@ dependencies:
138
138
  - - ">="
139
139
  - !ruby/object:Gem::Version
140
140
  version: 3.0.0
141
+ - !ruby/object:Gem::Dependency
142
+ name: ruby-debug-ide
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ type: :development
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
141
155
  - !ruby/object:Gem::Dependency
142
156
  name: rubocop
143
157
  requirement: !ruby/object:Gem::Requirement