[TIL] 25.01.29 WED

GDORI·2025년 1월 28일
0

TIL

목록 보기
174/184
post-thumbnail

csv-parser

CSV 파서를 사용하여 행과 열을 읽는 방법에 대하여 알아보았다.csv-parser 라이브러리를 사용하여 CSV 파일에서 데이터를 읽고 파싱하는 방법이다.

csv-parser 라이브러리를 설치

npm install csv-parser

기본 틀

import fs from 'fs';
import csv from 'csv-parser';

const results = [];

fs.createReadStream('data.csv')
  .pipe(csv())
  .on('data', (data) => {
    results.push(data); // 각 행의 데이터를 results 배열에 추가
  })
  .on('end', () => {
    // 데이터 처리
  });

입력 데이터

Name,Age,City
Alice,30,New York
Bob,25,Los Angeles
Charlie,35,Chicago

출력 데이터

만약 console.log를 찍었다고 하면 다음과 같은 결과값을 띈다.

[
  { Name: 'Alice', Age: '30', City: 'New York' },
  { Name: 'Bob', Age: '25', City: 'Los Angeles' },
  { Name: 'Charlie', Age: '35', City: 'Chicago' }
]

활용

일회성 테스트용이라 트랜젝션 처리도 안하고 주저리 주저리 썼다. 대용량 테스트용 데이터 넣기에 좋았다.
종종 활용할 것 같다.

import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import csv from 'csv-parser';
import mysql from 'mysql2'
import { config } from '../../config/config.js';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const csvPath = path.join(__dirname, './data.csv');

const { database } = config;

const connection = mysql.createConnection({
  host: database.USER_DB.host,
  user: database.USER_DB.user,
  password: database.USER_DB.password,
  database: database.USER_DB.name,
});

const results = [];

// 파일 읽기
fs.createReadStream(csvPath)
  // csv 스트림 연결
  .pipe(csv())
  .on('data', (data) => {
    // 데이터 입력
    results.push(data);
  })
  .on('end', () => {
    // 데이터 처리
    const filterData = results.filter(
      (result) => result.answers && Object.keys(result).length === 9,
    );

    // 문제 SQL
    const problemSql =
      'INSERT INTO problems (sector_id, type, difficulty, title, description, hint, explanation, reference) VALUES ?';
    // 답안 SQL
    const answerSql = 'INSERT INTO options (problem_id, type, option_text, isCorrect) VALUES ?';

    // 문제 value
    const problemValue = [];
    // 답안 value
    const answerValue = [];

    // Value 처리
    filterData.forEach((data) => {
      // 문제
      problemValue.push([
        Number(data.sector_id),
        Number(data.typeNum),
        Number(data.difficulty),
        data.title,
        data.description,
        data.hint,
        data.explanation,
        data.reference,
      ]);
    });

    // 데이터베이스에 문제 데이터 삽입
    connection.query(problemSql, [problemValue], (error, results) => {
      if (error) throw error;

      const insertedId = results.insertId;

      // 삽입된 문제 ID를 기반으로 답안 데이터 설정
      filterData.forEach((data, index) => {
        const problemId = insertedId + index;
        const answers = data.answers.split(',');
        answers.forEach((answer,idx) => {
          answerValue.push([
            problemId,
            Number(answer.type),
            answer,
            idx===0,
          ]);
        });
      });

      // 데이터베이스에 답안 데이터 삽입
      connection.query(answerSql, [answerValue], (error, results) => {
        if (error) throw error;
        console.log('Data inserted successfully.');
        connection.end();
      });
    });
  });
profile
하루 최소 1시간이라도 공부하자..

0개의 댓글

관련 채용 정보