想象一下,您有许多长文本文件,并且您只需要从每个文本的第一行提取数据(不读取任何其他内容)。 Node JS中最好的方法是什么?
谢谢!
答案 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)
答案 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
条件`或复杂的匹配)并且只读取第一行