Rust Polars:能否基于BufReader或Vec<u8>读取指定CSV内容?
问题解答
完全不需要写入临时文件,你提到的两种初始化方式都可行,以下是具体实现说明:
1. 传入包含目标字节的Vec
csv库的CsvReader支持从任何实现Read trait的类型读取数据。你可以用std::io::Cursor将Vec<u8>包装成可读取的流,直接初始化读取器:
use csv::Reader; use std::io::Cursor; // 假设csv_bytes是你提取出的CSV内容字节 let csv_bytes: Vec<u8> = b"name,age\nAlice,30\nBob,25".to_vec(); let mut reader = Reader::from_reader(Cursor::new(csv_bytes)); // 读取CSV记录 for result in reader.records() { let record = result.unwrap(); println!("{:?}", record); }
2. 传入定位到目标行的BufReader
你之前遇到光标被移回起始位置的问题,是因为默认的CsvReader会尝试检测BOM(字节顺序标记),这个操作会触发流的回退。解决办法是通过ReaderBuilder禁用BOM检测,同时确保你的BufReader已经定位到CSV内容的起始位置:
use csv::ReaderBuilder; use std::fs::File; use std::io::{BufRead, BufReader}; let file = File::open("mixed_format.txt").unwrap(); let mut buf_reader = BufReader::new(file); // 跳过非CSV内容,定位到CSV起始行 while let Some(line) = buf_reader.lines().next() { let line = line.unwrap(); if line.starts_with("name,age") { // 替换为你的CSV表头标识 break; } } // 创建读取器时禁用BOM检测,避免光标回退 let mut reader = ReaderBuilder::new() .detect_bom(false) .from_reader(buf_reader); // 读取CSV内容 for result in reader.records() { let record = result.unwrap(); println!("{:?}", record); }
补充说明
csv库的核心设计就是支持任意Read流输入,不管是内存中的字节数据、定位后的文件流,还是其他自定义流都可以适配,完全不需要依赖物理文件路径或临时文件。
内容的提问来源于stack exchange,提问作者Martin Jepsen
相关产品推荐
相关产品推荐

