2016-08-02 3 views
0

fast-csvfromPath() 메서드를 사용하여 파일의 데이터를 읽습니다. 이 데이터를 배열에 쓰고 싶습니다. (나중에 정렬 할 것입니다.) 나는 아래의 코드는이 목적을 위해 일을 기대하지만, 그렇지 않습니다 :fast-csv로 파일 읽기 및 배열 쓰기

var csv = require('fast-csv'); 

var dataArr = []; 
csv.fromPath("datas.csv", {headers: true}) 
.on("data", data => { 
    console.log(data); 
    // > { num: '4319', year: '1997', month: '4', day: '20', ... 
    dataArr.push(data); 
}); 
console.log(dataArr); 
// > [] 

가이 코드를 사용하여 파일의 데이터를 읽을 수,하지만 배열이 채워지지 않습니다.

이 작업을 수행하는 좋은 방법은 무엇이며 위 코드가 작동하지 않는 이유는 무엇입니까?

답변

1

"데이터의" 콜백이 비동기, 콜백에 따라 명령이 콜백이 완료되기 전에 실행됩니다. 이것이 코드가 작동하지 않는 이유이며,이 추론은 답변과 코멘트를 게시 한 다른 사람들이 지적한 것입니다.

작업을 수행하는 좋은 방법은 "끝" 콜백을 사용하는 것이 적합하다는 것입니다. 여기서 의도는 파일이 완전히 읽힌 후에 전체 데이터로 "무언가를"하는 것입니다.

var dataArr = []; 
csv.fromPath("datas.csv", {headers: true}) 
.on("data", data => { 
    dataArr.push(data); 
}) 
.on("end",() => { 
    console.log(dataArr.length); 
    // > 4187 
}); 
+0

2016 년 12 월의 답변에 감사드립니다. – swyx

2

모듈의 "on data"콜백은 비동기식입니다. 따라서이 줄

console.log(dataArr); 

은 콜백 전에 실행되므로 항상 비어있게됩니다.

이 문제를 해결하려면 배열을 처리하고 콜백 내에서 정렬해야합니다. 예를 들면 :

var dataArr = []; 
csv.fromPath("datas.csv", {headers: true}) 
    .on("data", data => { 
     dataArr.push(data); 

     var sorted = _.sortBy(dataArr, 'propertyX'); 
     // do something with 'sorted' 
});