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();
});
});
});