如何在Rust上使用Polars将所有列读取为str?

vmdwslir  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(139)

如何阅读所有列作为字符串与极点在生 rust ?这是我的准则
let df = CsvReader::from_path(filecsv)?.has_header(true).finish()?; Ok(df)
它以int64的形式读取一些数据,但我想以字符串的形式读取所有列(无论何时调用它们)。我该怎么做?

yzuktlbb

yzuktlbb1#

这是我的解决方案,它只能将一些(不是所有)字段转换为str,您需要添加smartstring crate。

use polars::datatypes::DataType::Utf8;
use polars::prelude::*;
use smartstring::SmartString;
use std::sync::Arc;
fn main() {
    let mut schema = Schema::new();
    schema.with_column(SmartString::from("some_columns"), Utf8);
    let df_csv = CsvReader::from_path("some_input.csv")
        .unwrap()
        .infer_schema(None)
        .has_header(true)
        .with_dtypes(Some(Arc::new(schema)))
        .finish()
        .unwrap();
    println!("{}", df_csv);
}

=================================================
经过进一步的实验,我找到了另一种方法。这需要使用csv机箱。首先,您需要使用rdr.headers()读取CSV headers并将它们Map到迭代器中。然后,使用from_iter创建模式。

use polars::datatypes::DataType::Utf8;
use polars::prelude::*;
use std::sync::Arc;

fn main() {
    
    let mut rdr = csv::Reader::from_path("some_input.csv").unwrap();

    let column_names = rdr.headers().unwrap().iter().map(|item| Field::new(item,Utf8));
    let schema = Schema::from_iter(column_names);
    let df_csv = CsvReader::from_path("some_input.csv")
        .unwrap()
        .infer_schema(None)
        .has_header(true)
        .with_dtypes(Some(Arc::new(schema)))
        .finish()
        .unwrap();
    println!("{}", df_csv);
}

这种方法的缺点是它需要阅读文件两次,效率很低。不幸的是,目前我还没有找到一个合适的API来避免这个限制。
也许有更好的解决方案……?

相关问题