변환할 json
12345678910111213141516171819202122
[ { "name": "test1", "age": 20, "phone": "0101112222" }, { "name": "test2", "age": 25 }, { "name": "test4", "age": 15, "phone": "545343123", "team": "home" }, { "name": "test3", "age": 42, "phone": "0101112222" }]
변환하는 코드.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
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);});
변환한 결과