본문 바로가기

자바스크립트 끄적끄적

자바스크립트로 csv 파일 읽기 방법

728x90

# csv 샘플은 해당 주소에서 다운 받으실 수 있습니다.

# https://github.com/goodsosbva/JS_Algorithm-DataStructuer/blob/main/codingTest/BRIQUE/sample.csv

 

GitHub - goodsosbva/JS_Algorithm-DataStructuer: 자바스크립트의 역량 강화를 위해 자료구조 & 알고리즘을 자

자바스크립트의 역량 강화를 위해 자료구조 & 알고리즘을 자바스크립트 복습 용도 저장소. Contribute to goodsosbva/JS_Algorithm-DataStructuer development by creating an account on GitHub.

github.com

 


 

# 목적: . fs모듈을 이용하여 csv 파일을 읽습니다. 그 다음 목적에 맞게 전처리를 하고자 합니다.

 

[코드]

const fs = require("fs");

var data = [];
const csv = fs.readFileSync("sample.csv");
csvTmp = csv.toString();
var csvFiles = csvTmp.split("\r")

 

[설명]

# 1. readFileSync(파일위치)를 기입하는 형태로 파일을 넣으면, 아래와 같이 나옵니다.

<Buffer 70 30 2c 20 70 31 2c 20 70 32 2c 20 70 33 2c 20 70 34 2c 20 70 35 2c 20 70 36 2c 20 70 37 2c 20 70 38 2c 20 70 39 0d 0a 37 2c 34 39 2c 37 33 2c 35 38 ... 15000244 more bytes>

# 2. 이걸 toString()을 써서 문자열로 바꿔줍니다.

그러면 아래처럼 csv파일형태로 나오는걸 알 수 있습니다.

p0, p1, p2, p3, p4, p5, p6, p7, p8, p9
7,49,73,58,30,72,44,78,23,9
40,65,92,42,87,3,27,29,40,12
3,69,9,57,60,33,99,78,16,35
97,26,12,67,10,33,79,49,79,21
67,72,93,36,85,45,28,91,94,57
1,53,8,44,68,90,24,96,30,3
22,66,49,24,1,53,77,8,28,33
98,81,35,13,65,14,63,36,25,69
15,94,29,1,17,95,5,4,51,98
88,23,5,82,52,66,16,37,38,44
1,97,71,28,37,58,77,97,94,4
9,31,45,75,35,98,42,99,68,12
60,57,94,8,95,68,13,30,6,62
42,65,82,52,67,21,95,12,71,1
90,31,38,57,16,90,40,79,35,6
72,98,95,19,54,23,89,60,5,26
23,6,13,70,38,94,20,44,66,34
26,94,63,38,44,90,50,59,23,47
85,17,72,39,47,85,96,85,23,20
44,68,35,15,25,34,42,11,79,52
44,95,18,96,92,15,91,33,69,97
53,47,25,10,62,11,8,77,61,25
35,68,95,76,67,39,74,31,56,1
72,60,94,84,55,89,7,15,93,69
80,55,55,6,63,2,76,8,49,31
44,38,8,97,51,49,3,31,31,14
19,75,9,80,29,23,54,60,37,45
.....

# 3. 이제 해당 p0 ~ p9 각각에 pi(i = 0 ~ 9)에 해당 값을 한줄씩 리스트 형태로 넣는 전처리를 할겁니다.

# 4. 그래서 우선 \r : 줄바꿈을 기준으로 스플리팅을 시작했습니다.

콘솔을 찍어보면 다음과 같이 나옵니다.

'p0, p1, p2, p3, p4, p5, p6, p7, p8, p9',
  '\n7,49,73,58,30,72,44,78,23,9',
  '\n40,65,92,42,87,3,27,29,40,12',
  '\n3,69,9,57,60,33,99,78,16,35',
  '\n97,26,12,67,10,33,79,49,79,21',
  '\n67,72,93,36,85,45,28,91,94,57',
  '\n1,53,8,44,68,90,24,96,30,3',
  '\n22,66,49,24,1,53,77,8,28,33',
  '\n98,81,35,13,65,14,63,36,25,69',
  '\n15,94,29,1,17,95,5,4,51,98',
  '\n88,23,5,82,52,66,16,37,38,44',
  '\n1,97,71,28,37,58,77,97,94,4',
  '\n9,31,45,75,35,98,42,99,68,12',
  '\n60,57,94,8,95,68,13,30,6,62',
  '\n42,65,82,52,67,21,95,12,71,1',
  '\n90,31,38,57,16,90,40,79,35,6',
  '\n72,98,95,19,54,23,89,60,5,26',
  '\n23,6,13,70,38,94,20,44,66,34',
  '\n26,94,63,38,44,90,50,59,23,47',
  '\n85,17,72,39,47,85,96,85,23,20',
  '\n44,68,35,15,25,34,42,11,79,52',
  '\n44,95,18,96,92,15,91,33,69,97',
  '\n53,47,25,10,62,11,8,77,61,25',
  '\n35,68,95,76,67,39,74,31,56,1',
  '\n72,60,94,84,55,89,7,15,93,69',
  '\n80,55,55,6,63,2,76,8,49,31',
  '\n44,38,8,97,51,49,3,31,31,14',
  '\n19,75,9,80,29,23,54,60,37,45',
  '\n17,25,0,56,64,97,48,4,50,50',
  '\n76,12,54,97,4,81,48,65,78,99',
  '\n9,29,53,83,47,7,73,22,5,76',
  '\n53,24,30,66,0,44,70,85,16,98',
  '\n55,33,57,76,78,66,57,11,78,14',
  '\n19,37,33,91,20,62,33,97,31,88',
  '\n89,73,77,4,58,0,54,60,15,47',
  '\n80,30,55,46,7,38,0,26,35,57',
  '\n13,14,93,60,54,18,57,85,29,15',
  '\n63,2,17,43,19,67,47,69,95,3',
  '\n73,3,48,85,58,59,6,30,24,32',
  ...

 

# 5. 이제 \n의 기준으로 스플르팅을 하고, 빈칸이 생길 경우가 높기에 빈칸도 지워주고자 합니다.

코드는 아래와 같습니다.

 

for (let i = 1; i < csvFiles.length; i++) {
    var csvdata = csvFiles[i].trim().split(",")
    ...

# 5 [실행] : 콘솔을 찍어보면 아래와 같습니다

 

[
  '62', '80', '2',
  '67', '7',  '59',
  '29', '55', '93',
  '25'
]
[
  '48', '5',  '6',
  '75', '70', '30',
  '81', '10', '9',
  '3'
]
[
  '7',  '32', '94',
  '47', '46', '2',
  '22', '78', '89',
  '32'
]
...

 

# 6. 배열 하나하나에 잘드어간걸 알 수 있습니다.

우리는 성공적으로 csv파일을 읽어서 자바스크립트 배열안에 넣는거에 성공했습니다!! 짝짞짝😁😁😁

 


 

# 7. 그냥 가면 아쉬우니까 해당 리스트들의 최소값, 최대값, 합계, 평균, 표준 편차, 중간값 을 구해보고, 결과를 출력하는 코드를 올리고 마치도록 하겠습니다.

# 8. 또한 해당 csv 파일은 10개의 데이터가 들어가야 하지만 9개 나오는 경우가 있습니다. 한 마디로 데이터가 유실된 상황을 고려하여 코드를 짰습니다.

 

[코드]

for (let i = 1; i < csvFiles.length; i++) {
    var csvdata = csvFiles[i].trim().split(",")
    if (csvdata.length === 10) {
        var numbers = toNumbers(csvdata);
        // 최소값, 최대값, 합계, 평균
        var minVal = Math.min(...numbers);
        var maxVal = Math.max(...numbers);
        var summary = numbers.reduce((a, b) => (a + b));
        var m = summary / numbers.length;
        // 표준 편차
        var standardDeviation = 0;
        for (let i = 0; i < numbers.length; i++) {
            standardDeviation += (numbers[i] - m) ** 2 
        }
        standardDeviation = Math.sqrt(standardDeviation / numbers.length);
        // 중간값
        var midValue = numbers.sort((a, b) => a - b)[numbers.length / 2 << 0]
        
        data.push([minVal, maxVal, summary, m, standardDeviation, midValue])
    }
}

 

[실행 결과]

 

[
  [ 7, 78, 443, 44.3, 24.964174330427994, 49 ],
  [ 3, 92, 437, 43.7, 28.01446055165082, 40 ],
  [ 3, 99, 459, 45.9, 30.144485399488907, 57 ],
  [ 10, 97, 473, 47.3, 29.76256037373129, 49 ],
  [ 28, 94, 668, 66.8, 23.228430855311775, 72 ],
  [ 1, 96, 417, 41.7, 32.93341767870441, 44 ],
  [ 1, 77, 361, 36.1, 23.368568633957878, 33 ],
  [ 13, 98, 499, 49.9, 27.804496039309903, 63 ],
  [ 1, 98, 409, 40.9, 38.38606517995821, 29 ],
  [ 5, 88, 451, 45.1, 25.974795475614428, 44 ],
  [ 1, 97, 564, 56.4, 35.14029026630258, 71 ],
  [ 9, 99, 514, 51.4, 30.715468415767326, 45 ],
  [ 6, 95, 493, 49.3, 31.689272632864267, 60 ],
  [ 1, 95, 508, 50.8, 29.583103285490516, 65 ],
  [ 6, 90, 482, 48.2, 28.248185782453355, 40 ],
  [ 5, 98, 541, 54.1, 32.51599606347621, 60 ],
  [ 6, 94, 408, 40.8, 26.675082005497188, 38 ],
  [ 23, 94, 534, 53.4, 22.725316279427222, 50 ],
  ...

 


[전체 코드]

 

const { parse } = require("csv-parse");
const fs = require("fs");

var data = [];
const csv = fs.readFileSync("sample.csv");
csvTmp = csv.toString();
var csvFiles = csvTmp.split("\r")

// 숫자 변환
const toNumbers = arr => arr.map(Number);

for (let i = 1; i < csvFiles.length; i++) {
    var csvdata = csvFiles[i].trim().split(",")
    if (csvdata.length === 10) {
        var numbers = toNumbers(csvdata);
        // 최소값, 최대값, 합계, 평균
        var minVal = Math.min(...numbers);
        var maxVal = Math.max(...numbers);
        var summary = numbers.reduce((a, b) => (a + b));
        var m = summary / numbers.length;
        // 표준 편차
        var standardDeviation = 0;
        for (let i = 0; i < numbers.length; i++) {
            standardDeviation += (numbers[i] - m) ** 2 
        }
        standardDeviation = Math.sqrt(standardDeviation / numbers.length);
        // 중간값
        var midValue = numbers.sort((a, b) => a - b)[numbers.length / 2 << 0]
        
        data.push([minVal, maxVal, summary, m, standardDeviation, midValue])
    }
}

console.log(data);

 

 


후기

 

csv파일을 한번 긁어서 가져오는 작업을 해봤습니다.

한 번 알아놓으면 유용하게 쓸거 같아 정리좀 해봤네요..

(❁´◡`❁)

728x90