Csv 解析TSV文件(ASCII)的惯用方法

Csv 解析TSV文件(ASCII)的惯用方法,csv,rust,Csv,Rust,我需要解析包含制表符分隔的数字的文件,我也知道它们总是只有两个。由于我的文件可能有几GB的大小,我想知道我当前的解析方法是否正确。考虑到我有一个固定的尺寸,看起来我可以更快地绘制地图,但我找不到如何制作 使用std::io:{self,prelude::*,BufReader}; 类型记录=(u32,u32); fn读取(内容:&[u8])->io::结果{ 确定(BufReader::新建(内容) .行() .地图(|线|{ 设nums:Vec=line .unwrap() .split(“\

我需要解析包含制表符分隔的数字的文件,我也知道它们总是只有两个。由于我的文件可能有几GB的大小,我想知道我当前的解析方法是否正确。考虑到我有一个固定的尺寸,看起来我可以更快地绘制地图,但我找不到如何制作

使用std::io:{self,prelude::*,BufReader};
类型记录=(u32,u32);
fn读取(内容:&[u8])->io::结果{
确定(BufReader::新建(内容)
.行()
.地图(|线|{
设nums:Vec=line
.unwrap()
.split(“\t”)
.map(|s | s.parse::().unwrap())
.收集();
(nums[0],nums[1])
})
收集::())
}
fn main()->io::Result{
让content=“1\t1\n\
2\t2\n”;
let records=read(content.as_bytes())?;
断言(records.len(),2);
断言(记录[0],(1,1));
assert_eq!(记录[1],(2,2));
好(())
}

如果您的条目只是数字,那么我们可以减少
map
中的一个内部
Vec
分配,如下所示:


使用std::io::{self,prelude::*,BufReader};
类型记录=(u32,u32);
fn读取(内容:&[u8])->io::结果{
返回Ok(BufReader::new(content).lines().map(| line |{
让line=line.unwrap();
让mut pair=line.split(“\t”).map(|s | s.parse::().unwrap());
(pair.next().unwrap(),pair.next().unwrap())
})收集::())
}
fn main()->io::Result{
让content=“1\t1\n\
2\t2\n”;
let records=read(content.as_bytes())?;
断言(records.len(),2);
断言(记录[0],(1,1));
assert_eq!(记录[1],(2,2));
好(())
}

您可能需要添加更好的错误处理:)

您应该使用带有选项卡分隔符的
csv
板条箱。您每行至少执行一次分配,加上记录Vec、csv的各种分配/再分配,特别是与Serde集成时,应允许或多或少为零。似乎分配的资源少了,谢谢。