在Node JS中只读取文件第一行的最有效方法是什么?

时间:2015-02-26 16:32:08

标签: javascript node.js stream filesystems text-files

想象一下,您有许多长文本文件,并且您只需要从每个文本的第一行提取数据(不读取任何其他内容)。 Node JS中最好的方法是什么?

谢谢!

5 个答案:

答案 0 :(得分:7)

我最终采用了这个解决方案,这似乎是迄今为止我见过的最高效的解决方案:

var fs = require('fs');
var Q = require('q');

function readFirstLine (path) {
  return Q.promise(function (resolve, reject) {
    var rs = fs.createReadStream(path, {encoding: 'utf8'});
    var acc = '';
    var pos = 0;
    var index;
    rs
      .on('data', function (chunk) {
        index = chunk.indexOf('\n');
        acc += chunk;
        index !== -1 ? rs.close() : pos += chunk.length;
      })
      .on('close', function () {
        resolve(acc.slice(0, pos + index));
      })
      .on('error', function (err) {
        reject(err);
      })
  });
}

为方便起见,我创建了一个npm模块,名为" firstline"。

感谢@dandavis建议使用String.prototype.slice()

答案 1 :(得分:5)

在这种情况下,几乎有一个内置模块-readline。它避免了混乱的块等。代码如下所示:

import tkinter as tk
from tkinter import messagebox as m_box

win = tk.Tk()

entry_var = tk.StringVar()
entry = tk.Entry(win, text='Enter the number', textvariable=entry_var)
entry.grid(row=0, column=0)


def submit():
    entry_var_get = entry_var.get()
    if entry_var_get.isdigit():
        entry_var_get = int(entry_var_get)
    if not entry_var_get or entry_var_get == 0:
        m_box.showerror('error', 'empty value')
    else:
        m_box.showinfo('success', f'value entered: {entry_var_get}')


submit_btn = tk.Button(win, text='submit', command=submit)
submit_btn.grid(row=1, column=0)

win.mainloop()

答案 2 :(得分:2)

请试试这个:

https://github.com/yinrong/node-line-stream-util#get-head-lines

一旦得到头条线,它就会打开上游。

答案 3 :(得分:1)

//你走了;

var lineReader = require('line-reader');
var async = require('async');

exports.readManyFiles = function(files) {
    async.map(files, 
        function(file, callback))
            lineReader.open(file, function(reader) {
              if (reader.hasNextLine()) {
                reader.nextLine(function(line) {
                  callback(null,line);
                });
              }
            });
        },
        function(err, allLines) {
            //do whatever you want to with the lines
        })
}

答案 4 :(得分:0)

我知道这并不能完全回答问题,但对于那些正在寻找可读简单方法的人来说:

const fs = require('fs').promises;

async function getFirstLine(filePath) {
    const fileContent = await fs.readFile(filePath, 'utf-8');
    return (fileContent.match(/(^.*)/) || [])[1] || '';
} 

注意

  • 自然,这仅适用于文本文件,我假设您从描述中使用了该文件
  • 这个处理空文件并返回一个空字符串
  • 这个正则表达式非常高效,因为它很简单(没有 OR 条件`或复杂的匹配)并且只读取第一行