mjw*_*zor 1 string vector rust
我有一个来自 CSV 文件的字符串,其中包含多行:
header1,header2,header3
r1v1,r1v2,r1v3
r2v1,r2v2,r2v3
Run Code Online (Sandbox Code Playgroud)
我正在尝试将这些推入Vec<Vec<String>>:
// the csv is raw_string
let lines = raw_string.lines();
let mut mainVec = Vec::new();
for row in lines {
let mut childVec = Vec::new();
let trimmed = row.trim();
let values = trimmed.split(',').collect();
childVec.push(values);
mainVec.push(childVec.clone());
}
Run Code Online (Sandbox Code Playgroud)
但我得到了错误
header1,header2,header3
r1v1,r1v2,r1v3
r2v1,r2v2,r2v3
Run Code Online (Sandbox Code Playgroud)
另一个基于迭代器的解决方案:
fn main() {
let raw_string = r"rust
header1,header2,header3
r1v1,r1v2,r1v3
r2v1,r2v2,r2v3";
let main_vec = raw_string.lines()
.map(|s| s.trim().split(',').map(String::from).collect::<Vec<String>>())
.collect::<Vec<Vec<String>>>();
print!("{:?}", main_vec);
}
Run Code Online (Sandbox Code Playgroud)
正如@Simon Whitehead 已经说过的,您唯一需要做的collect()就是指定类型,因为这是一个通用方法。但在某些情况下,它也可能由编译器本身推断出来。
上面的代码关于类型规范非常详细:实际上,您可以Vec不指定 的值类型,并让编译器像这样推导它:
let main_vec = raw_string.lines()
.map(|s| s.trim().split(',').map(String::from).collect::<Vec<_>>())
.collect::<Vec<_>>();
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅method的定义collect()。