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。