2017-12-14 29 views
0

テキストファイルを1行ずつ分割し、行内の文字( ':')に遭遇して配列に格納したいとします。マップ上の点をプロットするために配列が必要です。私は静的配列でそれを行うときにプロットをうまくやることができます。私は間違って行くよどこテキストファイルを読み込み、Javascriptを使って配列に格納する

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を使用してファイルの読み取りの同期バージョンに切り替えることもできます。

同期バージョンはコンテンツを直接返し、便利なコールバックを使用しませんが、ファイルが読み込まれるまでスクリプトの残りの部分の実行をブロックします。これは通常、大容量のファイルを処理する場合のユーザーエクスペリエンスには悪いため、非同期バージョンが優先されます。

コールバックには2つの引数(the fs.readFile documentation参照)があります。errdataです。 errが設定されている場合、何らかの理由で読み取りが失敗したことを意味します。実際のデータは第2引数として供給されます。

最後に、コールバックは入力を行に分割し、結果の配列を ':'区切り文字で分割しようとします。しかし、各行をデリミタで区切りたいので、行を分割するには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 =(テキストを意味します。 '(0); split(": ")[0]; textByLine.forEach((ip)=> { addIPMarker(ip); }) })'まだ動作しません私の場合は..: – harry04

+0

はい、それは正しい位置になります。私はコールバックに2つの問題があることに気付きました。 – mmlr

関連する問題