Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js Readline未写入输出文件 背景_Javascript_Node.js_File_Stream - Fatal编程技术网

Javascript Node.js Readline未写入输出文件 背景

Javascript Node.js Readline未写入输出文件 背景,javascript,node.js,file,stream,Javascript,Node.js,File,Stream,我试图逐行读取一个数GB大小的文件。我想处理每一行,然后将其写入一个文件。我不想(也不能)把一切都记在记忆里 重要的是,我读取一行的顺序是我将其写入文件的顺序 代码 为了实现这一点,我尝试使用Node.js 问题 如您所见,我正在尝试读取一行代码,对其进行解析,然后将其写入名为out.csv的文件中 问题是输出文件总是空的。什么都没有写进去 我已经阅读了所有的方法、事件和选项,但显然我遗漏了一些东西 问题: 为什么这个代码没有写入文件?你能试试这个吗 const fs = require( "f

我试图逐行读取一个数GB大小的文件。我想处理每一行,然后将其写入一个文件。我不想(也不能)把一切都记在记忆里

重要的是,我读取一行的顺序是我将其写入文件的顺序

代码 为了实现这一点,我尝试使用Node.js

问题 如您所见,我正在尝试读取一行代码,对其进行解析,然后将其写入名为
out.csv
的文件中

问题是输出文件总是空的。什么都没有写进去

我已经阅读了所有的方法、事件和选项,但显然我遗漏了一些东西

问题: 为什么这个代码没有写入文件?

你能试试这个吗

const fs = require( "fs" ),
readline = require( "readline" );

const readStream = fs.createReadStream("./logs/report.csv");
const writeStream = fs.createWriteStream("./logs/report.csv");

readStream.pipe(writeStream);
答复 使用当前代码,我实际上再次使用
transformedLine
输入
Readline

这不是我想要的。我应该做的是直接写到
writeStream

rl.on( "line", function(line) {
    console.log(line);

    //Do your stuff ...
    const transformedLine = line.toUpperCase();
    console.log(transformedLine);

    //Then write to outstream
    writeStream.write( transformedLine );
});
这将根据输入顺序生成一个输出文件

有关流机制和内部缓冲区的更详细讨论,请参阅:


我提这个问题已经很晚了,但是对于读到这篇文章的人来说:

如果每次
读取
时都
写入
,并且写入速度低于读取速度,则仍会导致内存膨胀。虽然不如将整个文件读入内存

您应该将
pipe
stream.Transform
一起使用,而不是
readline
。原因是管道在流中最慢的参与者阶段处理数据,所以不会占用内存

const stream=require('stream');
常数fs=要求('fs');
const readStream=fs.createReadStream(“./logs/report.csv”);
const writeStream=fs.createWriteStream(“./logs/report.csv”);
const transformer=new stream.Transform({
//buffer是流的一个块,enc是块的类型,done是转换完成时的回调
转换(缓冲区、enc、完成){
常量行=buffer.toString().split('\n');
const transformedChunkAsString=lines.map(workYourMagicAndReturnFormattedLine.join('\n');
const transformedBuffer=Buffer.from(transformedChunkAsString);
这个.push(transformedBuffer);
完成();
}
})
readStream.pipe(transformStream).pipe(writeStream);

将“terminal”设置为true将把该行写入文件writestream。它将在不进行任何转换的情况下写入该行,并且仅限于历史大小。这两件事我都不想要。这样做将创建我的文件的副本。这不是我想要的。如果我尝试转换数据,它也会异步地执行,而不保留任何顺序。只有这样,问题是块可能在中间行分裂,因此正则表达式可能不匹配您所寻找的。您可以将最后一行存储在transform函数外的变量中,如果没有完成,则将其前置到下一个块中
rl.on( "line", function(line) {
    console.log(line);

    //Do your stuff ...
    const transformedLine = line.toUpperCase();
    console.log(transformedLine);

    //Then write to outstream
    writeStream.write( transformedLine );
});