Rust 炉甘石板条箱(锈迹)只读取xlsx文件的第一行,如何修复? 我对铁锈感兴趣是一种爱好(我是一个业余程序员,我用Python和C++来自动工作),我现在尝试通过移植一些我的Python代码来进行数据分析以实现生锈。然而,事实证明,这对我来说相当困难,因为我在这方面是一个彻头彻尾的新手,大多数资源和文档更倾向于中级和高级用户(至少在数据科学方面)

Rust 炉甘石板条箱(锈迹)只读取xlsx文件的第一行,如何修复? 我对铁锈感兴趣是一种爱好(我是一个业余程序员,我用Python和C++来自动工作),我现在尝试通过移植一些我的Python代码来进行数据分析以实现生锈。然而,事实证明,这对我来说相当困难,因为我在这方面是一个彻头彻尾的新手,大多数资源和文档更倾向于中级和高级用户(至少在数据科学方面),rust,xlsx,Rust,Xlsx,我试图使用炉甘石板条箱将xlsx文件加载到Vec中,但是在for循环中使用迭代器的.next()方法时,只解析第一行,所以我显然做错了什么。作为可能有用的额外信息,xlsx文件由23851行和28列组成,实际数据(不考虑标题,这些标题不是要读取的)从位置A3开始 let range = excel .worksheet_range("Sheet0") .ok_or(calamine::Error::Msg("Cannot fi

我试图使用炉甘石板条箱将xlsx文件加载到Vec中,但是在for循环中使用迭代器的.next()方法时,只解析第一行,所以我显然做错了什么。作为可能有用的额外信息,xlsx文件由23851行和28列组成,实际数据(不考虑标题,这些标题不是要读取的)从位置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());
let range=excel
.工作表范围(“表0”)
.ok_或(炉甘石::错误::消息(“找不到表0”)??;
让start=range.start().unwrap();
让end=range.end().unwrap();
//要读取的第一个单元格从“A3”开始,可能有更好的方法
让range=range.range((start.0+2,start.1),end);
普林顿!((“开始:{:?}-End:{:?}”,range.Start(),range.End());
让mut iter=RangeDeserializerBuilder::new().具有_头(false)。从_范围::(&range)?;
让mut-df:Vec=Vec::new();
对于iter.next()中的结果{
比赛结果{
Ok(行)=>{df.push(行);}
Err(e)=>println!(“错误:{}”,e),};
}
//这个打印的是'Size:1',我期待的是总行数
普林顿!((“大小:{:?}”,df.len());
此代码只读取excel文件的第一行,因此vec仅包含第一行

非常感谢您的帮助


提前感谢

我在代码中看到的错误是如何处理迭代器<代码>下一步()将在每次调用一个元素时返回一个元素。要获取下一个元素,必须再次调用它

环路

for result in iter.next() {
    match result {
        Ok(row) => { df.push(row); }
        Err(e) => println!("Error: {}", e), };
}
将只产生一个结果,因为中的
接收到的列表是来自
iter.next()的返回值

如果只使用迭代器或
替换它,而让Some()=iter.next()

用于。。。in
将在迭代器上运行,直到next返回None,但不应调用它

在另一种方法
while let
中,每次循环重新启动时都会执行分配。因此需要
next()

while let Some(result) = iter.next() {
  ...
}

您应该能够遍历整个空间。

谢谢您的帮助,它现在可以正常工作了,我学到了一些新东西。
while let Some(result) = iter.next() {
  ...
}