아무거나

[NodeJS] CSV File 을 JSON 으로 변환 (CSV to JSON) 본문

Javascript & HTML & CSS/NodeJS

[NodeJS] CSV File 을 JSON 으로 변환 (CSV to JSON)

전봉근 2022. 12. 2. 11:01
반응형

Nodejs Express Document

기능

  • S3 에 File Upload 기능 구현
    • 라이브러리 설치
      $ npm install multer
      $ npm install aws-sdk
      
    • File Upload Util
      const fs = require("fs")
      const path = require("path")
      const multer = require("multer")
      
      /**
      * Save For File Upload (Use Multer Module)
      */
      export const saveForFileUpload = multer({
        storage: multer.diskStorage({
          destination(req, file, done) {
            const dirPath = path.resolve("./") + "\\uploads"
            if (!fs.existsSync(dirPath)) {
              fs.mkdirSync(dirPath, { recursive: true })
            }
      
            done(null, "uploads/")
          },
          filename(req, file, done) {
            // 파일명을 어떤 이름으로 올릴지
            const ext = path.extname(file.originalname) // 파일의 확장자
            done(null, path.basename(file.originalname, ext) + "_" + Date.now() + ext)
          },
        }),
        limits: { fileSize: 5 * 1024 * 1024 },
      })    
      
    • S3 File Upload Util
      import AWS from "aws-sdk"
      
      const fs = require("fs")
      
      export const s3FileUpload = async (reqFile) => {
        const result = new Object()
        const file = fs.createReadStream(reqFile.path)
      
        // process.env.REACT_APP_AWS_SECRET_KEY
        AWS.config.update({
          accessKeyId: "{accessKeyId}",
          secretAccessKey: "{secretAccessKey}",
          region: "ap-northeast-2", // 서울 리전
        })
      
        const s3 = new AWS.S3()
      
        // S3 Upload Required Option Setting
        const param = {
          Bucket: "test/upload",
          Key: reqFile.filename,
          ACL: "public-read",
          Body: file,
          ContentType: reqFile.mimetype,
        }
        const data = await s3.upload(param)
      
        result.file = param
        result.uploadResult = data
        result.reqFile = reqFile
      
        return result
      }
      
    • API 생성
      // File 은 formdata 형식으로 uploadFile 값으로 넘김
      app.post(
        `fileUpload`,
        saveForFileUpload.single("uploadFile"),
        async (req, res) => {
          await s3FileUpload(req.file)
        }
      )
      
  • CSV File 을 JSON 으로 변환 (CSV to JSON)
    • 모듈추가
      $ npm i multer
      
    • API
      import { saveForFileUpload, csvFileToJson } from "../../utils/importUtils"
      
      app.post(
        "/csvImport",
        saveForFileUpload.single("uploadFile"),
        async (req, res) => {
          const jsonData = csvFileToJson(req)
          console.log(jsonData)
          res.json(result)
        }
      )    
      
    • importUtils (여기에서 함수를 만들어서 공통으로 사용)
      const fs = require("fs")
      const path = require("path")
      const multer = require("multer")
      
      /**
      * Save For File Upload (Use Multer Module)
      */
      export const saveForFileUpload = multer({
        storage: multer.diskStorage({
          destination(req, file, done) {
            const dirPath = path.resolve("./") + "\\uploads"
            if (!fs.existsSync(dirPath)) {
              fs.mkdirSync(dirPath, { recursive: true })
            }
      
            done(null, "uploads/")
          },
          filename(req, file, done) {
            // 파일명을 어떤 이름으로 올릴지
            const ext = path.extname(file.originalname) // 파일의 확장자
            done(null, path.basename(file.originalname, ext) + "_" + Date.now() + ext)
          },
        }),
        limits: { fileSize: 5 * 1024 * 1024 },
      })    
      
      /**
      * Csv File To json Object Parser
      * @param {Request} req
      * - Request Data
      * @returns
      */
      export const csvFileToJson = (req) => {
        const data = fs.readFileSync(req.file.path, { encoding: "utf8" })
      
        const rows = data.split("\r\n")
        if (rows[rows.length - 1] === "") {
          rows.pop()
        }
        let results = []
        let columnTitle = []
        for (const i in rows) {
          const row = rows[i]
          const data = row.split(",")
          if (i === "0") {
            columnTitle = data
          } else {
            let row_data = {}
            for (const index in columnTitle) {
              const title = columnTitle[index].replaceAll('"', "")
              row_data[title] = data[index]
            }
            results.push(row_data)
          }
        }
      
        return results
      }    
      

 

반응형
Comments