JSON Array를 CSV로 변환하기
2018-07-22 15:13:14

변환할 json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[
{
"name": "test1",
"age": 20,
"phone": "0101112222"
},
{
"name": "test2",
"age": 25
},
{
"name": "test4",
"age": 15,
"phone": "545343123",
"team": "home"
},
{
"name": "test3",
"age": 42,
"phone": "0101112222"
}
]

변환하는 코드.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

const fs = require('fs');
const data = require('./sample.json');

/**
* TODO: csv 헤더 만들기
*/
const makeHeader = () => new Promise((resolve, reject) => {
try {
const length = [];
data.forEach((item) => {
length.push(Object.keys(item).length);
});
const index = length.indexOf(Math.max.apply(null, length)); // json Array에서 제일 프로퍼티가 많은 거를 헤더로 정함.
return resolve(Object.keys(data[index]));
} catch (err) {
return reject(err);
}
});

/**
* TODO: csv 몸통 만들기
* @param {*} header csv 헤더
*/
const makeBody = (header) => new Promise((resolve, reject) => {
try {
const body = [];
data.forEach((x) => {
header.forEach((y) => {
body.push(typeof x[y] !== 'undefined' ? x[y] : '');
});
});
const headerLen = header.length;
let result = header.join();
result += '\n'; // 헤더 뒤에 줄 바꿈.
body.forEach((item, index) => {
result += item;
if (Number(index + 1) % headerLen === 0) { // csv 양식으로 만든다.
result += '\n'; // 헤더만큼 다 있으면 줄 바꿈.
} else {
result += ','; // 업으면 콤마
}
});
return resolve(result);
} catch (err) {
return reject(err);
}
});

/**
* TODO: 파일 쓰기
* @param {*} csv csv 데이터
*/
const saveFile = (csv) => new Promise((resolve, reject) => {
fs.writeFile('test.csv', csv, (err) => {
if (err) return reject(err);
return resolve('write success');
});
});

makeHeader().then(async (header) => {
try {
const csv = await makeBody(header);
const result = await saveFile(csv);
console.log(result);
} catch (err) {
console.log(err);
}
}).catch((e) => {
console.log(e);
});

변환한 결과

결과

Prev
2018-07-22 15:13:14
Next