Я получил очень хороший ответ о том, как очистить строку/удалить строку в файле без необходимости обрезать файл или заменить файл на новую версию файл, вот код Python:Как перевести этот код Python на Node.js
#!/usr/bin/env python
import re,os,sys
logfile = sys.argv[1]
regex = sys.argv[2]
pattern = re.compile(regex)
with open(logfile,"r+") as f:
while True:
old_offset = f.tell()
l = f.readline()
if not l:
break
if pattern.search(l):
# match: blank the line
new_offset = f.tell()
if old_offset > len(os.linesep):
old_offset-=len(os.linesep)
f.seek(old_offset)
f.write(" "*(new_offset-old_offset-len(os.linesep)))
этот сценарий можно назвать как:
./clear-line.py <file> <pattern>
для образовательных целей, я пытаюсь выяснить, могу ли я написать в Node.js. Я могу, конечно, прочитать файл с Node.js по очереди. Но я не уверен, что Node.js имеет эквивалентные вызовы для tell/seek в этом случае.
эквивалент для записи, безусловно,
https://nodejs.org/api/fs.html#fs_fs_write_fd_buffer_offset_length_position_callback
Вот моя попытка
#!/usr/bin/env node
const readline = require('readline');
const fs = require('fs');
const file = process.argv[2];
const rgx = process.argv[3];
const fd = fs.openSync(file, 'r+');
const rl = readline.createInterface({
input: fs.createReadStream(null, {fd: fd})
});
let position = 0;
const onLine = line => {
position += line.length;
if (String(line).match(rgx)) {
let len = line.length;
rl.close();
rl.removeListener('line', onLine);
// output the line that will be replaced/removed
process.stdout.write(line);
fs.write(fd, new Array(len + 1).join(' '), position, 'utf8', err => {
if (err) {
process.stderr.write(err.stack || err);
process.exit(1);
}
else {
process.exit(0);
}
});
}
};
rl.on('line', onLine);
Это не совсем правильно - я не думаю, что я вычисляя смещение/положение правильно. Возможно, кто-то, кто знает как Python, так и Node, может помочь мне. Я не очень хорошо разбираюсь в вычислении позиции/смещения в файлах, особенно в терминах буферов.
Вот данные в текстовом файле, с которым я работаю. Все, что я хочу сделать, это прочитать первую строку, которая не пуста, а затем удалить эту строку из файла и записать эту строку в stdout.
Это может действительно непробельные данных, но вот JSON, что я работаю с:
{"dateCreated":"2016-12-26T09:52:03.250Z","pid":5371,"count":0,"uid":"7133d123-e6b8-4109-902b-7a90ade7c655","isRead":false,"line":"foo bar baz"}
{"dateCreated":"2016-12-26T09:52:03.290Z","pid":5371,"count":1,"uid":"e881b0a9-8c28-42bb-8a9d-8109587777d0","isRead":false,"line":"foo bar baz"}
{"dateCreated":"2016-12-26T09:52:03.390Z","pid":5371,"count":2,"uid":"065e51ff-14b8-4454-9ae5-b85152cfcb64","isRead":false,"line":"foo bar baz"}
{"dateCreated":"2016-12-26T09:52:03.491Z","pid":5371,"count":3,"uid":"5af80a95-ff9d-4252-9c4e-0e421fd9320f","isRead":false,"line":"foo bar baz"}
{"dateCreated":"2016-12-26T09:52:03.595Z","pid":5371,"count":4,"uid":"961e578f-288b-413c-b933-b791f833c037","isRead":false,"line":"foo bar baz"}
{"dateCreated":"2016-12-26T09:52:03.696Z","pid":5371,"count":5,"uid":"a65cbf78-2ea1-4c3a-9beb-b4bf56e83a6b","isRead":false,"line":"foo bar baz"}
{"dateCreated":"2016-12-26T09:52:03.799Z","pid":5371,"count":6,"uid":"d411e917-ad25-455f-9449-ae4d31c7b1ad","isRead":false,"line":"foo bar baz"}
{"dateCreated":"2016-12-26T09:52:03.898Z","pid":5371,"count":7,"uid":"46f8841d-c86c-43f2-b440-8ab7feea7527","isRead":false,"line":"foo bar baz"}
{"dateCreated":"2016-12-26T09:52:04.002Z","pid":5371,"count":8,"uid":"81b5ce7e-2f4d-4acb-884c-442c5ac4490f","isRead":false,"line":"foo bar baz"}
{"dateCreated":"2016-12-26T09:52:04.101Z","pid":5371,"count":9,"uid":"120ff45d-74e7-464e-abd5-94c41e3cd089","isRead":false,"line":"foo bar baz"}
Я как раз собирался опубликовать ответ, в котором упоминается 'fs.createReadStream' ... как я думаю, у вас есть правильная идея. Для эквивалента Python's tell, есть несколько способов приблизиться к нему (например, «fs.readSync» может работать). 'fs.ReadSteam' имеет довольно много функций, с которыми вы можете работать, чтобы делать то, что вы пытаетесь сделать. –
спасибо, да, это близко к работе, но не совсем 100% –
Я не уверен, правильно ли я правильно вычисляю позицию. Я просто предполагаю, что позиция будет количеством символов в файле. –