gpt4 book ai didi

file - 逐行读取大文件并避免Rust中的utf8错误

转载 作者:行者123 更新时间:2023-12-03 11:35:25 25 4
gpt4 key购买 nike

我有一个很大的文件,“应该”由JSON字符串组成。但是,当我使用以下代码时,我得到了“流不包含有效的UTF8”。

let file = File::open("foo.txt")?;
let reader = BufReader::new(file);

for line in reader.lines() {
println!("{}", line?);
}

Ok(())
现在,答案是使用Vec而不是String。但是我所看到的所有代码都将 file.read_to_end(buf)作为答案,这对于我必须使用的文件大小不起作用。
我正在寻找的是逐行读取文件,使用有损utf8转换,然后进行一些计算,然后将输出推送到另一个文件。

最佳答案

您可以使用BufReader的 read_until 函数。它与File的read_to_end非常相似,但也带有byte分隔符参数。该分隔符可以是任何字节,而换行\n字节将适合您。之后,您可以从UTF-8有损地转换缓冲区。它看起来像这样:

let file = File::open("foo.txt")?;
let mut reader = BufReader::new(file);
let mut buf = vec![];

while let Ok(_) = reader.read_until(b'\n', &mut buf) {
if buf.is_empty() {
break;
}
let line = String::from_utf8_lossy(&buf);
println!("{}", line);
buf.clear();
}

Ok(())
当然,可以像 Lines一样将其抽象为迭代器,但是基本逻辑与上面相同。
注意:与 lines函数不同,生成的字符串将包含换行符,如果有,则返回回车符( \r)。如果解决方案的行为必须与 lines函数匹配,则将需要去除这些字符。

关于file - 逐行读取大文件并避免Rust中的utf8错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62721880/

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