我试图一次读一行大文件.我在Quora上发现了一个关于这个问题的问题,但是我错过了一些联系,以使整个事情融合在一起.
var Lazy=require("lazy");
new Lazy(process.stdin)
.lines
.forEach(
function(line) {
console.log(line.toString());
}
);
process.stdin.resume();
Run Code Online (Sandbox Code Playgroud)
我想弄清楚的是我如何从文件而不是STDIN一次读取一行,如本示例所示.
我试过了:
fs.open('./VeryBigFile.csv', 'r', '0666', Process);
function Process(err, fd) {
if (err) throw err;
// DO lazy read
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用.我知道,在一个紧要关头,我可以回到使用像PHP这样的东西,但我想弄清楚这一点.
我认为其他答案不会起作用,因为文件比我正在运行它的服务器大得多.
我需要在终端中传入一个文本文件,然后从中读取数据,我该怎么做?
node server.js file.txt
Run Code Online (Sandbox Code Playgroud)
如何从终端传递路径,如何在另一端读取?
请不要讲述我应该如何异步地做所有事情.有时我想以简单明了的方式做事,所以我可以继续其他工作.
由于某种原因,以下代码不起作用.它匹配我在最近的SO问题上找到的代码.节点改变或破坏了什么?
var fs = require('fs');
var rs = fs.createReadStream('myfilename'); // for example
// but I might also want to read from
// stdio, an HTTP request, etc...
var buffer = rs.read(); // simple for SCCCE example, normally you'd repeat in a loop...
console.log(buffer.toString());
Run Code Online (Sandbox Code Playgroud)
读取后,缓冲区为空.
我看到调试器中的rs
events
has end and open functions, nothing else
_readableState
buffer = Array[0]
emittedReadable = false
flowing = false <<< this appears to be correct
lots of other false/nulls/undefined
fd = null <<< …Run Code Online (Sandbox Code Playgroud) 我正在尝试逐行读取文件,执行一些具有回调的操作以及函数完成后恢复行读取.例如:
var fs = require('fs');
var readline = require('readline');
var stream = require('stream');
var instream = fs.createReadStream('./phrases.txt');
var outstream = new stream;
var rl = readline.createInterface(instream, outstream);
rl.on('line', function (line) {
rl.pause();
setTimeout(function () {
console.log('resuming');
rl.resume();
}, 2000);
});
Run Code Online (Sandbox Code Playgroud)
我的印象是上面的例子基本上应该读一行,等待2秒,console.log然后继续下一行.真正发生的是它等待前2秒,然后喷出很多console.log
我有一个大文件(utf8).我知道fs.createReadStream可以创建流来读取大文件,但不能同步.所以我尝试使用fs.readSync,但读取文本就像打破了"??".
var fs = require('fs');
var util = require('util');
var textPath = __dirname + '/people-daily.txt';
var fd = fs.openSync(textPath, "r");
var text = fs.readSync(fd, 4, 0, "utf8");
console.log(util.inspect(text, true, null));
Run Code Online (Sandbox Code Playgroud) 假设您有一个巨大的(> 1GB)CSV记录ID:
655453
4930285
493029
4930301
493031
...
Run Code Online (Sandbox Code Playgroud)
对于每个人,id您希望进行REST API调用以获取记录数据,在本地转换它,并将其插入本地数据库.
你如何使用Node.js' 可读Stream?
我的问题基本上是这样的:你如何逐行读取一个非常大的文件,为每一行运行一个异步函数,并且[可选]能够从特定的行开始读取文件?
从以下Quora问题我开始学习使用fs.createReadStream:
http://www.quora.com/What-is-the-best-way-to-read-a-file-line-by-line-in-node-js
var fs = require('fs');
var lazy = require('lazy');
var stream = fs.createReadStream(path, {
flags: 'r',
encoding: 'utf-8'
});
new lazy(stream).lines.forEach(function(line) {
var id = line.toString();
// pause stream
stream.pause();
// make async API call...
makeAPICall(id, function() {
// then resume to process next id
stream.resume();
});
});
Run Code Online (Sandbox Code Playgroud)
但是,该伪代码不起作用,因为该lazy模块强制您读取整个文件(作为流,但没有暂停).所以这种方法似乎不会起作用.
另一件事是,我希望能够从特定的行开始处理这个文件.原因是,处理每个id(进行api调用,清理数据等)每个记录可能需要半秒钟,因此我不希望每次都从文件的开头开始.我正在考虑使用的天真方法是捕获最后处理的id的行号,并保存它.然后,当您再次解析文件时,您将逐行流式传输所有ID,直到找到您中断的行号,然后您开展makeAPICall业务.另一种天真的方法是编写小文件(比如100个ID)并一次处理一个文件(足够小的数据集可以在没有IO流的情况下在内存中完成所有操作).有一个更好的方法吗?
我可以看到这是如何变得棘手(以及node-lazy进来的地方),因为 …
我正在尝试围绕 Dart Streams 进行思考。特别是这个命令行实用程序示例cat具有以下代码行:
Stream<List<int>> stream = new File(path).openRead();
// Transform the stream using a `StreamTransformer`. The transformers
// used here convert the data to UTF8 and split string values into
// individual lines.
return stream
.transform(UTF8.decoder)
.transform(const LineSplitter())
.listen((line) {
if (showLineNumbers) {
stdout.write('${lineNumber++} ');
}
stdout.writeln(line);
}).asFuture().catchError((_) => _handleError(path));
Run Code Online (Sandbox Code Playgroud)
Stream<T>as的声明Stream<List<int>>让我有点困惑。为什么不将其声明为Stream<int>. List<> 类型如何使它与众不同。如果是列表,订阅者事件是否以某种方式缓冲?
什么类型(如<T>)被传递给第一个转换?它是一个int还是一个List<int>?
传递给每个下一个转换的类型以及决定它们的类型的因素。
此示例是否在将转换结果传递给下一个转换之前读取整个文件?如果是这样,是否有关于如何流式传输非常大的文件的示例,类似于这个 Node 问题Parsing large logfiles in Node.js - read …
逐行读取文件的解决方案的后续操作,如下所述:https : //stackoverflow.com/a/16013228/570796
var fs = require('fs'),
readline = require('readline'),
instream = fs.createReadStream('/path/to/file');
var rl = readline.createInterface(
{
input: instream,
terminal: false
});
rl.on('line', function(line)
{
console.log(line);
// if(instream.isEnd()) ...
});
Run Code Online (Sandbox Code Playgroud)
如何检测我是否到达文件末尾?
我知道有一个事件,ReadStream on('end', () => {/*...*/})但我需要一个解决方案,我可以通过 if 语句检查它。
所以我有一个70mb .csv文件,我想要解析并转换为json,尝试在500kb测试csv中进行json转换我发现了一个简单的解决方案与正则表达式.
问题是当我放入我的实际数据时,我不能再使用fs.readFileSync了,所以我需要使用流.
我的问题是:我如何使用流和正则表达式?假设我的流在可能的正则表达式匹配中切断缓冲区,我想如果发生这种情况,我将丢失该数据.此外,数据没有结构化,所以我没有意识到解析它的方式比正则表达式.
如果我不清楚我的解释,请告诉我,英语不是我的主要语言,但我也知道英语社区也是最快也最可靠的.
提前致谢.
node.js ×8
javascript ×5
asynchronous ×1
dart ×1
dart-async ×1
file-io ×1
filestream ×1
filesystems ×1
fs ×1
io ×1
json ×1
mojibake ×1
readfile ×1
regex ×1
stream ×1