【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);



이상입니다.

좋은 웹페이지 즐겨찾기