json2csv 0.0.1 → 0.0.2
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.
- checksums.yaml +4 -4
- data/.gemspec +1 -0
- data/README.md +60 -0
- data/Rakefile +1 -1
- data/data/sample.json +17 -2
- data/lib/json2csv/cli/convert/convert.rb +41 -10
- data/lib/json2csv/version.rb +1 -1
- metadata +15 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bde3bd18b5a618adf8726f451417568341559b05
|
4
|
+
data.tar.gz: 6c5a12445f165ec69288e854c2a4a14dd74c90f1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
data/data/sample.json
CHANGED
@@ -3,8 +3,23 @@
|
|
3
3
|
"Firstname": "Joe",
|
4
4
|
"Lastname": "Doe",
|
5
5
|
"Address": {
|
6
|
-
"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
|
-
|
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
|
-
|
57
|
-
|
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
|
-
|
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
|
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
|
data/lib/json2csv/version.rb
CHANGED
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.
|
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
|