write csv file

azi_zero·2021년 9월 3일
1

leave a mark 🐾

목록 보기
5/6

CSV 파일을 생성하는 방법들

  1. csv-writer library를 사용하기

👍 파일에 쓰기를 할 때, header를 옵션으로 넣어서 처리할 수 있다.
👍 각각의 value를 따로 string화 할 필요가 없다.
👎 하나의 파일 안에 들어갈 데이터가 많아지면 짤려서 들어간다.

  1. txt파일에 csv형태로 넣어주기

👍 어지간한 용량은 다 커버가 가능하다.
👎 csv(comma separated value) 형태로 가공해야한다.

각각의 방법이 장단점이 있지만 !!
본인의 상황에서 가장 필요한 부분이 무엇인지 판단하여 선택하면 된다.

필자의 경우, 처음에는 csv-writer를 사용했지만 용량 문제로 txt로 전환해서 사용중이다.

두가지 방법을 간단한 예제 프로젝트를 통해서 알아보자.

logic

  1. header 설정하기
  2. 데이터 가공하기
  3. 파일 쓰기

예시 데이터를 얻기 위해서 fake.js를 이용했다.

import faker from 'faker';

csv-writer

  1. header 설정
  • csv-writer의 경우, header의 형식이 정해져 있다.
  • {id: value, title: value} 형식을 갖는 header를 만들어 줘야한다.
const txtHeader = ['name', 'gender', 'job', 'country', 'city'];
const csvWriterHeader = txtHeader.map((el) => {
  return { id: el, title: el };
});
  1. 데이터 가공
  • 각 데이터(for each row)의 형태는
    header의 각 값을 key로 갖고, 원하는 value를 넣은 object 이어야한다
  • 해당 Object의 key값이 header안에 없으면 파일에 쓰기가 안된다.
    (header와 key를 매칭하여 값을 넣기 때문에)
  • 각 row들은 하나의 array안에 최종적으로 위치해야한다!

// User type
interface User {
    name: string;
    gender: string;
    job: string;
    country: string;
    city: string;
  }

let result: User[] = [];
for (let i = 0; i < 20; i++) {
  let data: User = {
    name: faker.name.firstName(),
    gender: faker.name.gender(),
    job: faker.name.jobTitle(),
    country: faker.address.country(),
    city: faker.address.cityName(),
  };
  result.push(data);
}
  1. 파일 쓰기
    아주 간단하다!
    최종 파일의 경로와 header를 설정하고 난 후, 쓰기를 실행하면 된다!
const createCsvWirter = require('csv-writer').createObjectCsvWriter;
const csvWriter = createCsvWirter({
  path: './csv-writer.csv', 
  header: csvWriterHeader,
});

csvWriter.writeRecords(result).then(() => {
  console.log('done!');
});

txt

  1. header 설정
  • csv-writer처럼 header와 각 data의 key matching이 일어나지 않기 때문에 string으로 선언해주면 된다.
const txtHeader = 'name,gender,job,country,city\n'
  1. 데이터 가공
    두가지 방법이 있다.
  • data를 object로 가공한 후, stringify해주기
    데이터가 복잡할 때 사용
let result = txtHeader;
for (let i = 0; i < 20; i++) {
  let data: User = {
    name: faker.name.firstName(),
    gender: faker.name.gender(),
    job: faker.name.jobTitle(),
    country: faker.address.country(),
    city: faker.address.cityName(),
  };

  let stringified = Object.values(data).join(',') + '\n';
  result += stringified;
}
  • 처음부터 string으로 만들기
    데이터가 단순할 때 사용
    가독성은 떨어지지만, Array.join()의 사용을 줄일 수 있다는 장점이 있다.
let result = txtHeader.join(',') + '\n';
for (let i = 0; i < 20; i++) {
  result += `${faker.name.firstName()},${faker.name.gender()},${faker.name.jobTitle()},${faker.address.country()},${faker.address.cityName()}\n`;
}
  1. 파일 쓰기
  • fs를 사용한다.
import fs from 'fs';

fs.writeFileSync('./csv-txt.txt', result, { encoding: 'utf-8' });

마치며

가장 중요한 부분은 csv파일은 결국 string형태의 value들이 comma(,)로 구분되어 있는 형식의 파일이라는 것이다.

최종 파일의 특성, 코드의 가독성 등등을 잘 따져서 본인의 상황에 맞게 잘 사용하면 좋을 것 같다.

profile
잘 하고 싶은 욕심을 가득 갖고 태어남

0개의 댓글