본문으로 건너뛰기

JSON → CSV: json-2-csv 사용법

  author: Dev.ian
createdAt: 2022-12-16
updatedAt: 2022-12-16

💡 이 포스트는 json-2-csv: ^3.14.4 기준으로 작성하였습니다.

json-2-csv

  • 이 라이브러리를 이용해 보다 간단하게 JSON 데이터를 CSV 로 변경할 수 있다.

      import { json2csvAsync } from 'json-2-csv';

    // data
    const items: object[] = [
    {
    name: 'John',
    age: 27,
    },
    {
    name: 'Jack',
    age: 63,
    },
    {
    name: 'Dan',
    age: 35,
    },
    ];

    // 1. json -> csv line
    const csvLine: string = await json2csvAsync(items);

    // 2. generate cvs file
    fs.writeFileSync('파일경로/파일명.csv', csvLine);

1) json2csvAsync

  export function json2csvAsync(data: object[], options?: IFullOptions): Promise<string>;

json2csvAsync 함수는 2개의 매개변수가 필요하다. 주의할 점은 json2csvAsync() 의 파라미터에 반드시 객체의 리스트가 들어가야 한다는 점이다. 기본형(number, string 등) 리스트는 에러가 발생한다.

2) options

- emptyFieldValue : 빈 값(undefined 또는 null)의 기본값 설정

  • csv 로 변경할 JSON 데이터(아래의 height, weight)가 undefined 또는 null 인 경우, csv 파일에 넣을 값을 지정할 수 있다.

  • SampleCode

      // data
    const items: object[] = [
    {
    name: 'John',
    age: 27,
    height: 182,
    weight: 83,
    },
    {
    name: 'Jack',
    age: 63,
    weight: 83,
    },
    {
    name: 'Dan',
    age: 35,
    },
    ];

    // 빈 값이 있다면 하이픈('-') 을 넣는다.
    const csvLine: string = await json2csvAsync(items, {emptyFieldValue: '-'});
  • 결과

      name,age,height,weight,hobby
    John,27,182,83
    Jack,63,-,83
    Dan,35,-,-

- expandArrayObjects: 배열 데이터의 표시 방법 설정. (default: false)

  • SampleCode

      // data
    const items: object[] = [
    {
    name: 'John',
    age: 27,
    height: 182,
    weight: 83,
    },
    {
    name: 'Jack',
    age: 63,
    weight: 83,
    },
    {
    name: 'Dan',
    age: 35,
    hobby: [
    {
    game: [
    'LOL',
    'OverWatch'
    ]
    },
    {
    sport: [
    'soccer',
    'running'
    ]
    }
    ]
    },
    ];

    const csvLine: string = await json2csvAsync(items, {
    emptyFieldValue: '-',
    expandArrayObjects: false,
    });
  • 결과

    • 배열 데이터(hobby)들은 JSON.stringfy() 를 한 값이 csv 파일로 생성된다.
      name,age,height,weight,hobby
    John,27,182,83,
    Jack,63,-,83,
    Dan,35,-,-,"[{""game"":[""LOL"",""OverWatch""]},{""sport"":[""soccer"",""running""]}]"
  • 옵션을 expandArrayObjects: true 로 변경한 결과는 아래와 같다.

    const csvLine: string = await json2csvAsync(items, {
    emptyFieldValue: '-',
    expandArrayObjects: true,
    });
      name,age,height,weight,hobby.game,hobby.sport
    John,27,182,83,-,
    Jack,63,-,83,-,
    Dan,35,-,-,"[""LOL"",""OverWatch""]","[""soccer"",""running""]"

- prependHeader : csv 파일의 헤더(header) 표시 여부 설정. (default: true)

- sortHeader: 헤더 정렬 설정. (default: false)

Pure JS(?)

  • Sample Code

      // data
    const items: object[] = [
    {
    name: 'John',
    age: 27,
    },
    {
    name: 'Jack',
    age: 63,
    },
    {
    name: 'Dan',
    age: 35,
    }
    ];

    // 1. Member array -> string array
    const csvLines: string[] = items.map((item: object) => `${item.name},${item.age}`);

    // 2. string array -> string
    const csvLine: string = csvLines.join('\n');

    // 3. generate cvs file
    fs.writeFileSync('파일경로/파일명.csv', csvLine);

1) 각 데이터를 콤마(,)로 구분하여 문자열(string)로 변환하기

  // 1. Member array -> string array
const csvLines: string[] = items.map((item: Member) => `${item.name},${item.age}`);

2) 변환된 문자열 배열을 개행문자(\n)로 연결하여 1개의 문자열로 만들기

  // 2. string array -> string
const csvLine: string = csvLines.join('\n');

3) csv 파일 생성

  // 3. generate cvs file
fs.writeFileSync('파일경로/파일명.csv', csvLine);