如何将文件的每一行传输到数组单元格?

时间:2016-06-17 14:52:34

标签: javascript node.js

我尝试读出一个带有id的文件并将其作为数组返回。每行包含一个id。我想将每个id转移到一个数组单元格。那是我的代码:

var fs = require('fs');
var reader = fs.createReadStream('RTIdList.js', {encoding: 'utf8'});
reader.once( 'end' ,  function ()  { 
    console.log( 'Read completed successfully.' ); 
});

var lineReader = require('readline').createInterface({
  input: reader,
});

function RTIdReader(){
  var arrayPos = 0;
  var idArray = new Array();

  lineReader.on('line', function (line) {
    console.log('Line from file:', line); 
    idArray[arrayPos] = line;
    arrayPos++;
  });

  console.log('idArray[0]: '+idArray[0]);
  return idArray;
}

RTIdReader();  

你有一个想法,我做错了什么?怎么会这样?

@DrakaSAN:代码一直有效,直到填满数组。我无法console.log或返回数组。代码在lineReader.on

之后停止

自从回合开始大约两周后我就开始回调了。猜猜,我不理解他们。这是我的尝试:

var fs = require('fs');

function RT(idList){
  console.log('RT works');
}

function idList(){
  var idArray = new Array();
  var reader = fs.createReadStream('RTIdList.js', {encoding: 'utf8'});
  reader.once( 'end' ,  function ()  { 
      console.log( 'Read completed successfully.' ); 
  });

  var lineReader = require('readline').createInterface({
    input: reader,
  });

  return {
    lineReader.on('line', function (line) {
      console.log('Line from file:', line); 
      idArray.push(line);
      return idArray;
    }
  }
}  

RT();

为什么我的回调不起作用?

好的,回到开头。这就是我的开始。

var fs = require('fs');

var idArray = new Array();
var reader = fs.createReadStream('RTIdList.js', {encoding: 'utf8'});
reader.once( 'end' ,  function ()  { 
  console.log( 'Read completed successfully.' ); 
});

var lineReader = require('readline').createInterface({
  input: reader,
});

lineReader.on('line', function (line) {
  console.log('Line from file:', line); 
  idArray.push(line);
});

除了回调之外我该怎么做?

1 个答案:

答案 0 :(得分:1)

在向数组添加数据时使用push,您执行此操作的方式是将属性添加到数组中的对象,如时尚。差异很小,但可能会在以后咬你的屁股。

查看readline文档以了解如何使用它,您根本不需要阅读器。

您的返回与代码开始读取文件的同时发生,您需要检查异步函数的工作方式。

使用代码的提示:

你根本不需要fs.createReadStream。

数组中所有id的回调都在.on('close', function () {/*here*/});

编辑:

在javascript中,您可以将函数作为参数传递,并创建匿名函数。

因此,您不在异步代码中使用return,而是将其余代码作为参数传递,按照惯例将其命名为callback

至于如何使用readline来读取文件,一个很好的例子是in the documentation,它可以在不到5分钟的时间内转换为你的用例。

编辑:

好的,我已经花时间制作代码了。

(arg) => {}function (arg) {}

相同
const readline = require('readline');
const fs = require('fs');

function RT(file, callback) {
  let idArray = [];     //Declare idArray

  const rl = readline.createInterface({  //Set and start readline
    input: fs.createReadStream(file)
  });

  rl.on('line', (line) => { //For each line
    console.log('Line from file:', line);
    idArray.push(line);   //Add it to the array
  });

  rl.on('close', () => {  //At the end of the file
    callback(idArray);    //Call the rest of the code
  });
}

RT('RTIdList.js', (idArray) => {
  console.log('Here is the idArray: ' + idArray);
});