【Node.js】JSON 문자열을 CSV 파일로 내뿜는다
요구사항
· DB에 저장된 데이터를 CSV로 다운로드 할 수 있습니다.
· 데이터는 사용자가 응답 한 설문 결과
사용한 모듈
· json2csv
htps //w w. 음 pmjs. 코 m / 파 c 카게 / j 2 csv
개발
1. 데이터 성형
이번에는 사용자가 답변한 설문조사 결과를 CSV로 출력하고 싶습니다.
데이터 성형
// DBから出力したいデータを取得する
const data = await getData.getUserData(user_id);
// データをJSON型に整える
const groupData = data.reduce((result, current) => {
// user_idごとにデータをまとめる
const element = result.find((p) => {
return p.id === current.user_id;
});
// user_idが既にあればquestionとanswerのみを追加する
if (element) {
element.data.push({
question: current.question,
answer: current.answer
});
} else { // user_idが切り替わった時に新規の要素としてgroupDataに追加する
result.push({
id: current.user_id,
name: current.user_name,
email: current.user_email,
data: [{
question: current.question,
answer: current.answer,
}],
});
}
return result;
}, []);
DB에서 얻은 데이터를 JSON으로 성형했습니다. reduce 함수를 사용하고 있는 것은 1 쿼리로 적절한 형태로 데이터를 취득할 수 없었기 때문에, 필수는 아닙니다. for 문이나 map 함수를 사용하여 청소하십시오.
reduce 함수로의 데이터를 그룹화는 이하를 참고로 했습니다.
참고 사이트
JavaScript 객체 배열을 sql의 group by와 같이 집계
성형한 데이터는 다음과 같이 되었습니다. 데이터의 개수는 동일하지 않아도 괜찮습니다.
groupData 내용
[
{
id: 267,
name: "taro",
email: "[email protected]",
data:[
{
question: "好きなプログラミング言語は?",
answer: ["HTML", "CSS", "JavaScript"]
},
{
question: "得意なプログラミング言語は?",
answer: ["HTML", "CSS"]
},
{
question: "苦手なプログラミング言語は?",
answer: ["JavaScript"]
}
]
},
{
id: 269,
name: "jiro",
email: "[email protected]",
data:[
{
question: "好きなプログラミング言語は?",
answer: ["Go", "JavaScript"]
},
{
question: "得意なプログラミング言語は?",
answer: ["PHP", "Ruby"]
},
{
question: "苦手なプログラミング言語は?",
answer: ["Java"]
}
]
},
]
2. JSON을 CSV로 변환
이어 JSON으로 성형한 데이터를 CSV로 변환해 나갑니다. 이번에는
ユーザー名
라는 모듈을 사용했습니다. 그 밖에도 CSV계의 모듈은 많이 있었습니다.추가:2020/09/27
이전에 json2csv로 출력 된 CSV 파일이 Excel에서 깨질 수 있습니다.이라는 기사 내에서
メールアドレス
옵션을 붙이면 Excel에서도 깨지지 않을 것이라고 썼습니다. 하지 않으려면 단순히 UTF-8 대신 Shift-JIS에 문자 코드를 설정하십시오. 매우 실례했습니다.Shift-JIS로의 변환은
アンケート設問
라는 모듈을 사용했습니다.get_csv.js
const {Parser, transforms: {unwind}} = require('json2csv');
const jconv = require('jconv'); // 追記:2020/09/27
function getCsv(data, fields, pathes, res) {
const transforms = [unwind({
paths: pathes,
blankOut: true,
})];
const json2csvParser = new Parser({fields, transforms});
const csv = data.length ? json2csvParser.parse(data) : '';
res.setHeader('Content-disposition', 'attachment; filename=data.csv');
res.setHeader('Content-Type', 'text/csv; charset=Shift_JIS');
return (jconv.convert(csv, 'UTF8', 'SJIS')); // 追記:2020/09/27
}
module.exports = getCsv;
인수의
回答結果
는 이전에 성형한 데이터가 건너옵니다. json2csv
에는 data 안에 표시시키고 싶은 항목을 배열로 건네줍니다. 이번 예라면 다음과 같이 됩니다.fields의 내용
const fields = ['name', 'email', 'data.question', 'data.answer'];
question과 answer은 data 중첩이므로 점을 연결합니다.
마지막
withBOM
은 data에 중첩 된 항목을 배열로 전달합니다. 이번 예에서는 다음과 같습니다.pathes의 내용
const pathes = ['data']
여기서 pathes 안에
jconv
를 넣으면 answer에 저장된 배열이 확장되어 표시됩니다. 이번에는 하나의 설문에 대해 여러 대답을 한 줄로 표시하고 싶었기 때문에 data만 했습니다.그 밖에도 다양한 옵션이 있으므로 자세한 내용은 공식 문서을 참조하십시오.
3. CSV 출력
나중에 CSV로 변환한 데이터를 POST 등의 라우팅으로
data
해 주면 브라우저에서 파일을 다운로드할 수 있습니다.CSV 출력
const csv = getCsv(groupData, fields, pathes, res);
res.send(csv);
이상입니다.
Reference
이 문제에 관하여(【Node.js】JSON 문자열을 CSV 파일로 내뿜는다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kum44/items/d11f97ecee3e46d3195d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)