본문 바로가기

개인공부 기록/JavaScript

[JavaScript] CSV파일 추가하여 출력하기

csv파일을 javascript에서 읽어와 출력하는 문제이다.

csvtojson 같은 모듈 사용하는 경우 코드 한두줄에 간단하게 끝나지만, node의 내장 모듈만 사용하여 구현해보았다.

users.csv
posts.csv

우선 users.csv의 경우 정렬이 잘 되어 있었 편했지만, posts.csv 파일의 경우 띄어쓰기, 개행이 제대로 되어있지 않아 불러와서 바로 사용하는게 불가능 하였다. 그래서

첫번째. users.csv 파일을 불러와 배열 형태로 가공하고

두번째. posts.csv파일도 별도로 가공하였다.

세번째. posts.csv 파일을 user_id 별로 분리하였고

마지막으로 users.csv파일에서 user_id별로 불러와 직접 추가해주었다.

 

구현하기 위한 로직의 간단한 설명

 

  // --------------------users.csv--------------------------------
    const fs = require('fs'); //csv파일 읽어오기 위한 모듈
    const path = require('path'); //csv파일 읽어오기 위한 모듈
    const name = "users.csv"
    const array = []; //빈 배열 생성
  
    const csvPath = path.join(__dirname, '.', name); //파일디렉토리, 파일명
    const csv = fs.readFileSync(csvPath, "utf-8"); //읽기 형식 지정

    const rows = csv.split("\r\n") //열 구분
    const header = rows[0].split(','); //0열 출력
  
    for(i = 1; i < header.length; i++) {
      let obj = {}; //빈 객체 생성
      let row = rows[i].split(',');
      for(j = 0; j < row.length-1; j++) {
        obj[header[j]]=row[j]; //객체에 직접 추가

       } array.push(obj); //객체를 배열에 추가
    }
    
      // -----------posts.csv-------------------

    const PostName = "posts.csv"
    const PostList = []; //빈 배열 생성

    const PostCsvPath = path.join(__dirname, '.', PostName); //파일디렉토리, 파일명
    const PostCsv = fs.readFileSync(PostCsvPath, "utf-8"); //읽기 형식 지정

    const PostRows = PostCsv.split("\n") //열 구분
    const PostHeader = PostRows[0].split(','); //0열 헤더에 저장
    const PostHeader1 = PostHeader.join(','); //공백지우기
    const PostHeader2 = PostHeader1.split(', '); //공백지우기

    for(i = 1; i < PostRows.length-1; i++) {  //i=0은 헤더
      let PostObj = {}; //빈 객체 생성
      let PostValue = PostRows[i].split(',');


      for(j = 0; j < PostValue.length-1; j++) {
        PostObj[PostHeader2[j]]=PostValue[j];
       } 
      PostList.push(PostObj);
    }

posts.csv 파일은 띄어쓰기, 개행을 처리하고 배열에 넣기 위해 추가로 split, join을 사용하여 정리해주었다.

이후 posts.csv 파일을 user_id 별로 구분하여 나누었다.

// posts.csv user_id 별로 분리
  
   let PostList2 = PostList.filter(function(id) {
    return id.user_id == '1';
   })

   let PostList3 = PostList.filter(function(id) {
    return id.user_id == '2';
   })

   let PostList4 = PostList.filter(function(id) {
    return id.user_id == '3';
   })

   let PostList5 = PostList.filter(function(id) {
    return id.user_id == '4';
   })

filter() 함수를 사용하여 개별적으로 나누어 저장하였다.

  // posts.csv user_id 과 일치하는  users.csv ID 에 객체 추가하기
   array[0]["posts"] = PostList2;
   array[1]["posts"] = PostList3;
   array[2]["posts"] = PostList4;
   array[3]["posts"] = PostList5;

이후에 직접 지정을해서 배열에 저장하였다.

 

먼저 마지막 배열에 직접 추가해주는 경우 배열을 직접 지정해주어 배열 id가 변경되면 코드를 수정을 해야되는 문제점이 있다.

그리고 개별적으로 분리해서 불러오는 것이 아니라, 바로 user_id를 검사해서 추가할 수 있는 방법을 생각해봐야겠다.

Recent Posts
Popular Posts
Recent Comments