gpt4 book ai didi

javascript - 如何将此 Python 代码转换为 Node.js

转载 作者:搜寻专家 更新时间:2023-10-31 23:59:22 29 4
gpt4 key购买 nike

我在这里得到了一个很好的答案,关于如何清除文件中的一行/删除一行而不必 chop 文件或用新版本的文件替换文件,这是 Python 代码:

#!/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 调用。

肯定是 write 的等价物

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 的人可以帮助我。我不太熟悉计算文件中的位置/偏移量,尤其是在缓冲区方面。

这是我正在使用的文本文件中的数据。我想要做的就是读取非空的第一行,然后从文件中删除该行并将该行写入标准输出。

这实际上可以是任何非空白数据,但这是我正在使用的 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"}

最佳答案

您应该考虑每行末尾的换行符,它不包含在您通过 readline 模块获得的“行”中。也就是说,你应该更新position为position += (line.length + 1),然后在写的时候使用position即可(不用-1).

关于javascript - 如何将此 Python 代码转换为 Node.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41329374/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com