Calamine crate (Rust) 只读取 xlsx 文件的第一行,如何修复?
Calamine crate (Rust) only reads first row of xlsx file, how to fix?
我对 Rust 感兴趣(我是一名业余程序员,我使用 python 和 C++ 来自动化工作),目前我正在尝试通过移植来练习我的一些 python 数据分析代码生锈了,但是事实证明这对我来说非常困难,因为我在这方面是一个完全的菜鸟,而且大多数资源和文档更倾向于中级和高级生锈用户(至少用于数据科学)。
我正在尝试使用炉甘石箱将 xlsx 文件加载到 Vec 中,但是在 for 循环中使用迭代器的 .next() 方法时,只有第一行被解析,所以我很清楚做错事。作为可能有帮助的额外信息,xlsx 文件由 23851 行和 28 列组成,实际数据(不考虑 headers,不被读取)从位置 A3.
开始
let range = excel
.worksheet_range("Sheet0")
.ok_or(calamine::Error::Msg("Cannot find Sheet0"))??;
let start = range.start().unwrap();
let end = range.end().unwrap();
// First cell to be read starts at 'A3', theres probably a better way to do this
let range = range.range((start.0 + 2, start.1), end);
println!("Start: {:?} - End: {:?}", range.start(), range.end());
let mut iter = RangeDeserializerBuilder::new().has_headers(false).from_range::<_, mr::RawMR>(&range)?;
let mut df: Vec<mr::RawMR> = Vec::new();
for result in iter.next() {
match result {
Ok(row) => { df.push(row); }
Err(e) => println!("Error: {}", e), };
}
// This prints 'Size: 1', I was expecting the total number of rows
println!("Size: {:?}", df.len());
此代码仅设法读取 excel 文件的第一行,因此 vec 仅包含第一行。
非常感谢任何帮助。
提前致谢
我在你的代码中看到的错误是你如何对待迭代器。 next()
每次调用都会 return 一个元素。要获取下一个元素,必须再调用一次。
循环
for result in iter.next() {
match result {
Ok(row) => { df.push(row); }
Err(e) => println!("Error: {}", e), };
}
只会产生一个结果,因为 for in
收到的列表是 iter.next()
的 return 值
如果仅用迭代器或 while let Some()=iter.next()
.
替换它
for result in iter {
...
}
for ... in
将 运行 遍历迭代器直到下一个 returns None,但你不应该调用它。
在备选方案while let
中,每次循环重新启动时都会执行赋值。因此需要next()
while let Some(result) = iter.next() {
...
}
您应该能够遍历整个 space。
我对 Rust 感兴趣(我是一名业余程序员,我使用 python 和 C++ 来自动化工作),目前我正在尝试通过移植来练习我的一些 python 数据分析代码生锈了,但是事实证明这对我来说非常困难,因为我在这方面是一个完全的菜鸟,而且大多数资源和文档更倾向于中级和高级生锈用户(至少用于数据科学)。
我正在尝试使用炉甘石箱将 xlsx 文件加载到 Vec 中,但是在 for 循环中使用迭代器的 .next() 方法时,只有第一行被解析,所以我很清楚做错事。作为可能有帮助的额外信息,xlsx 文件由 23851 行和 28 列组成,实际数据(不考虑 headers,不被读取)从位置 A3.
开始 let range = excel
.worksheet_range("Sheet0")
.ok_or(calamine::Error::Msg("Cannot find Sheet0"))??;
let start = range.start().unwrap();
let end = range.end().unwrap();
// First cell to be read starts at 'A3', theres probably a better way to do this
let range = range.range((start.0 + 2, start.1), end);
println!("Start: {:?} - End: {:?}", range.start(), range.end());
let mut iter = RangeDeserializerBuilder::new().has_headers(false).from_range::<_, mr::RawMR>(&range)?;
let mut df: Vec<mr::RawMR> = Vec::new();
for result in iter.next() {
match result {
Ok(row) => { df.push(row); }
Err(e) => println!("Error: {}", e), };
}
// This prints 'Size: 1', I was expecting the total number of rows
println!("Size: {:?}", df.len());
此代码仅设法读取 excel 文件的第一行,因此 vec 仅包含第一行。
非常感谢任何帮助。
提前致谢
我在你的代码中看到的错误是你如何对待迭代器。 next()
每次调用都会 return 一个元素。要获取下一个元素,必须再调用一次。
循环
for result in iter.next() {
match result {
Ok(row) => { df.push(row); }
Err(e) => println!("Error: {}", e), };
}
只会产生一个结果,因为 for in
收到的列表是 iter.next()
如果仅用迭代器或 while let Some()=iter.next()
.
for result in iter {
...
}
for ... in
将 运行 遍历迭代器直到下一个 returns None,但你不应该调用它。
在备选方案while let
中,每次循环重新启动时都会执行赋值。因此需要next()
while let Some(result) = iter.next() {
...
}
您应该能够遍历整个 space。