csv파일을 javascript에서 읽어와 출력하는 문제이다.
csvtojson 같은 모듈 사용하는 경우 코드 한두줄에 간단하게 끝나지만, node의 내장 모듈만 사용하여 구현해보았다.
우선 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를 검사해서 추가할 수 있는 방법을 생각해봐야겠다.
'개인공부 기록 > JavaScript' 카테고리의 다른 글
[JavaScript] 스코프 체인(Scope Chain), 렉시컬환경 (0) | 2022.08.13 |
---|---|
비동기처리(async/await) (0) | 2022.08.07 |
배열에 특정단어를 포함한 문자 삭제하기 (2) (0) | 2022.07.23 |
문장에서 특정단어를 포함한 문자 삭제하기 (split, splice, join, indexof) (0) | 2022.07.21 |
접근자 프로퍼티 (Getter, Setter) 알아보기 (0) | 2022.07.08 |