使用Javascript读取文本文件并将其存储到数组中

时间:2017-12-14 07:19:18

标签: javascript arrays google-maps readfile

我想逐行拆分文本文件,然后遇到行中的字符(':'),将其存储在数组中。我需要该数组来绘制地图上的点。当我使用静态数组执行此操作时,我可以完成绘图。

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
}

但是,当我遵循这种方法时,我无法做到这一点 -

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
}  

任何人都可以告诉我哪里出错了,以及我如何纠正我的代码。我对JavaScript不是很熟悉。所以,我不确定我到底在做什么。任何帮助赞赏!谢谢!

1 个答案:

答案 0 :(得分:0)

这假设您正在使用节点的fs模块。

fs.readFile函数是异步的,你正确地处理回调中用其结果调用的行。

然而,在回调执行之前,您仍在使用已处理的textByLine。此时,数组仍然是空的。

您可以在分割文件内容后立即将textByLine.forEach部分移动到回调中,或者使用readFileSync切换到文件读取的同步版本。

同步版本将直接返回内容而不使用方便的回调,但它会阻止执行脚本的任何剩余部分,直到文件被读取为止。在处理可能较大的文件时,这通常对用户体验有害,因此首选异步版本。

回调确实得到两个参数(参见the fs.readFile documentation):errdata。如果设置了err,则表示由于某种原因读取失败。实际数据作为第二个参数提供。

最后,您的回调当前将输入拆分为行,然后尝试通过'来分割生成的数组:'分隔符。但是你指出你希望每个行都被分隔符拆分,所以拆分行应该在textByLine.forEach回调中完成。

因此您的回调可以像这样进行调整:

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

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