2017-12-14 9 views
0

줄 단위로 텍스트 파일을 분할 한 다음 줄의 문자 (':')를 만나서 배열에 저장하려고합니다. 그 배열을지도에 점을 그려야합니다. 내가 정적 배열로 할 때 잘 음모를 할 수 있습니다. 내가 잘못거야 어디자바 스크립트로 배열에 텍스트 파일 읽기 및 저장

var map = new google.maps.Map(document.getElementById('map'), googleMap); 
var infowindow = new google.maps.InfoWindow(); 
google.maps.event.addListener(infowindow, "closeclick", function() { 
     map.fitBounds(latlngbound); 
     map.panToBounds(latlngbound) 
}) 
var data_ip = []; 
var textByLine = []; 
readTextFile("./2017-12-12.txt", data_ip); 
var fs = require("fs"); 
fs.readFile("./2017-12-12.txt", function(text){ 
textByLine = (text.split("\n")).split(":")[0]; 
}); 

textByLine.forEach((ip) => { 
addIPMarker(ip); 
}) 
} catch(e){ 
    //handle error 
} 

아무도 말해 줄 수, 나는 내 코드를 수정할 수있는 방법 -이 방법을 수행 할 때

var map = new google.maps.Map(document.getElementById('map'), googleMap); 
var infowindow = new google.maps.InfoWindow(); 
google.maps.event.addListener(infowindow, "closeclick", function() { 
    map.fitBounds(latlngbound); 
    map.panToBounds(latlngbound) 
    }) 
var ipArray = ["70.177.167.189", "123.135.107.115", "123.135.107.115", "123.135.107.115", "123.135.107.115", "122.182.6.19", "24.19.187.145", "24.19.187.145", "24.19.187.145", "93.42.228.21", "82.102.2.210"]; 

ipArray.forEach((ip) => { 
addIPMarker(ip); 
}) 
} catch(e){ 
    //handle error 
} 

그러나, 나는 그것을 할 수 아니에요. JavaScript에 익숙하지 않습니다. 그래서, 정확히 내가 여기서 뭘하는지 잘 모르겠다. 어떤 도움을 주셔서 감사합니다! 감사!

답변

0

이것은 노드 모듈 fs을 사용하고 있다고 가정합니다.

fs.readFile 함수는 비동기식이므로 결과와 함께 호출되는 콜백의 행에 올바르게 처리해야합니다.

그러나 콜백이 실행되기 전에 처리 된 textByLine을 계속 사용하고 있습니다. 이 시점에서 배열은 여전히 ​​비어 있습니다.

textByLine.forEach 부분을 콜백으로 이동하거나 파일 내용을 분할 한 직후에 이동하거나 readFileSync을 사용하여 파일 읽기의 동기 버전으로 전환 할 수 있습니다.

동기 버전은 내용을 직접 반환하고 편리한 콜백을 사용하지 않지만 파일을 읽을 때까지 스크립트의 나머지 부분 실행을 차단합니다. 대개 큰 파일을 처리 할 때 사용자 환경에 좋지 않으므로 비동기 버전을 사용하는 것이 좋습니다.

콜백에는 errdata의 두 인수가 있습니다 (the fs.readFile documentation 참조). err이 설정되면 어떤 이유로 읽기가 실패했음을 의미합니다. 실제 데이터는 두 번째 인수로 제공됩니다.

마지막으로, 콜백은 현재 입력을 줄로 분리 한 다음 결과 배열을 ':'구분 기호로 분리하려고합니다. 그러나 각 줄을 구분 기호로 구분하려면 textByLine.forEach 콜백 내부에서 줄을 분할해야합니다.

는 콜백 따라서 다음과 같이 적용 할 수있다 :

function(err, text) { 
    if (err) { 
     // handle error somehow 
     return; 
    } 

    text.split('\n').forEach((line) => { 
     let ip = line.split(":")[0]; 
     addIPMarker(ip); 
    } 
} 
+0

그래서 당신은'fs.readFile ("./ 2017-12-12.txt", 기능 (텍스트) { textByLine = (텍스트를 의미한다.textByLine.forEach ((ip) => { addIPMarker (ip); }) })'여전히 작동하지 않습니다 (분할 ("\ n")). 나를 위해 ... : ( – harry04

+0

네, 정확한 위치가 될 것입니다. 콜백에 두 가지 문제가 더 있으며 문제 해결을 위해 내 대답을 편집 한 것으로 나타났습니다. – mmlr

관련 문제