使用 Polars Rust API,是否可以直接从 CSV 字符串/读取器创建 DataFrame,同时指定分隔符等选项?
目前,我正在通过将字符串保存到临时路径并使用
LazyCsvReader::new("tmp_path.csv")
读取它来解决此问题。
在最终的用例中,(可能很大的)CSV 数据通过例如接收一个请求。
use anyhow::Result;
use polars::prelude::*;
fn main() -> Result<()> {
let csv_str = "name|age|city
Alice|30|New York
Bob|25|London";
// Writing it to a file, but I'd prefer to read the CSV data directly.
std::fs::write("tmp.csv", csv_str)?;
let df = LazyCsvReader::new("tmp.csv").with_separator(b'|').finish()?.collect()?;
// Also tried `CsvReader`, though I couldn't figure out how to make it work with a custom delimiter.
/* let cursor = std::io::Cursor::new(csv_str);
let df = CsvReader::new(cursor).finish()?; */
println!("{df}");
Ok(())
}
您可以使用
into_reader_with_file_handle
结构体的 CsvReadOptions
方法来使用文件句柄创建 CSV 读取器。还可以使用 map_parse_options
功能设置自定义分隔符。
use polars::prelude::*;
fn main() {
let csv_str = "name|age|city
Alice|30|New York
Bob|25|London";
let cursor = std::io::Cursor::new(csv_str);
let df = CsvReadOptions::default()
.with_has_header(true)
.map_parse_options(|parse_options| parse_options.with_separator(b'|'))
.into_reader_with_file_handle(cursor)
.finish()
.unwrap();
println!("{:?}", df);
}