javascript - 如何从大文件中每隔几行插入文本
问题描述
我有一个大约 1GB 的 ASCII 文件,我的任务是每 1000 行编写一个固定文本。
例如
预期产出
text line 1
text line 2
text line 3
...
text line 999
text line 1000
// My fixed text
text line 1001
text line 1002
尝试 1 - JavaScript 堆内存不足
尝试一次写入一个字节,并跟踪换行符的数量。
每 1000 行写一次我的固定文本
let src = `/path/to/src`;
let dst = `/path/to/dst`;
let readStream = fs.createReadStream(src);
let writeStream = fs.createWriteStream(dst);
let newline = 0;
readStream.on('data', chunk => {
for(let i in chunk) {
let c = chunk[i];
// write one byte at a time
writeStream.write(Buffer.from(chunk.buffer, i, 1))
if(c == 10) {
newline++;
// write fixed text for every 1000th line
if(newline && newline % 1000 == 0) {
writeStream.write("My Fixed Text");
}
}
}
}).on('end', () => {
console.log('done');
});
致命错误:接近堆限制的无效标记压缩分配失败 - JavaScript 堆内存不足
Attemp 2 - 输出文件乱码且无序
与 attemp 1 相同,但从我预先分配的缓冲区中一次写入一个字节。
let src = `/path/to/src`;
let dst = `/path/to/dst`;
let readStream = fs.createReadStream(src);
let writeStream = fs.createWriteStream(dst);
let newline = 0;
let buffer = Buffer.alloc(1);
readStream.on('data', chunk => {
for(let i in chunk) {
let c = chunk[i];
buffer[0] = c;
// write one byte at a time from my pre-allocated buffer
writeStream.write(buffer)
if(c == 10) {
newline++;
// write fixed text for every 1000th line
if(newline && newline % 1000 == 0) {
writeStream.write("My Fixed Text");
}
}
}
}).on('end', () => {
console.log('done');
});
done
没有错误,脚本在打印后需要一段时间才能退出
但是,输出文件看起来完全乱码且无序
L,a'-etLL'7P62 ,,NL,n''he'L A,r'0et,L ,ei2'vrUb32oa0on' L,c27CirU 7' 2- tN Ng7Bha'0atLV7al'0e'pUbLe2,3 goLA0n'0,v',L9lc'1C,LI0Et0-m',UT5,nD1e''NU,On91arNE40r20ilHLVEn''''''''mwRL (3(0-r''NUB o00at S7Eo'7'clUR32 20vowL 64v80vaL 0,u00hNNUE4n,1'aa L 2 AC1p,,NU e2'Cit, 22y F8etLL56Ola-1C'NLS3n '3mrUS34nn1-CL,g5tw7ma'L)'4t60h'L
这项任务听起来简单明了,但我很难做到这一点。
任何帮助表示赞赏。
解决方案
推荐阅读
- matlab - 无法读取 MAT 文件 不是二进制 MAT 文件。尝试加载 -ASCII 以读取为文本
- assembly - 我们如何使用这些指令在汇编中使用跳转?
- entity-framework - 在 EntityFramework 2.1 Fluent API 在插入时设置审计字段
- machine-learning - 序列模型 Word2vec
- android - Recyclerview 游标适配器回收问题
- java - 如何使用 intent.putextra 设置 videoview 资源
- python - Python - 将系列(或列表)转换为数据框,只需要值
- reactjs - 有什么方法可以指定一个回调来包装响应吗?
- java - 创建从华氏到摄氏的Java转换表
- sql - 具有两个条件的 SQL 查询