Rust, Polars CSV: есть ли способ прочитать CSV из `impl BufRead` (или любого итератора по байтам)?

Я разбираю немного причудливый, собственный текстовый формат файла.

Формат содержит CSV, смешанный с файлами, отличными от CSV. Меня интересует только часть CSV, которая находится где-то в файле и окружена не-csv.

Мне было интересно, можно ли указать CsvReader/LazyCsvReader что-то вроде std::io::BufReader или даже Vec<u8>, содержащее содержимое CSV, вместо того, чтобы предоставлять AsRef<Path> (который должен указывать на файл, если я не ошибаюсь).

Я хочу инициализировать программу чтения CSV одним из следующих способов:

  • Поставьте BufReader, который будет оборачивать строки, которые я хочу прочитать.
  • Дайте ему Vec<u8>, который содержит все байты, которые я хочу прочитать.

Можно ли это сделать или мне нужно написать временный файл, содержащий только CSV?

Я попробовал задать CsvReaderBufReader<File>, где я уже переместил итератор .lines() туда, где начинаются мои данные. Но похоже, что CsvReader перед чтением перемещает курсор в начало потока.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
158
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете передать свой Vec<u8> (или любую другую вещь, реализующую AsRef<[u8]>), завернутую в Курсор , в CsvReader::new:

use polars::prelude::*;
use std::io::Cursor;
fn main() {
    let bytes = b"a,b,c\nd,e,f\ng,h,i".to_vec();
    let reader = CsvReader::new(Cursor::new(bytes));
    dbg!(reader.finish().unwrap());
}

Если ваши данные CSV разделены символами новой строки из ваших собственных дополнительных данных, вы также можете просто использовать with_skip_rows и with_n_rows, чтобы пропустить ведущие внешние данные и прочитать только количество строк, которые являются фактическим CSV:

    let reader = CsvReader::from_path("tmp.data")
        .unwrap()
        .with_skip_rows(1);
        .with_n_rows(Some(2));

tmp.data:

some proprietary none csv data
a,b,c
d,e,f
g,h,i
even more proprietary none csv data

Оба варианта производят одно и то же DataFrame:

┌─────┬─────┬─────┐
│ a   ┆ b   ┆ c   │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ str │
╞═════╪═════╪═════╡
│ d   ┆ e   ┆ f   │
│ g   ┆ h   ┆ i   │
└─────┴─────┴─────┘

Кроме этого, я не думаю, что вы можете использовать BufReader без реализации MmapBytesReader для его оболочки.

Очень полезный совет, спасибо! Из этого я понимаю, что Cursor<Vec<u8>> и BufReader<File> должны иметь некоторые общие черты. Могу ли я использовать Cursor<T>, где T — это любая итерация u8, или это не сработает? В частности, меня интересует что-то вроде Cursor::new(vec![...].iter().map(|x| ...))

Martin Jepsen 19.04.2024 23:00

Нет, это не сработает, как я уже писал, это должна быть реализация типа AsRef<[u8]>. Вы можете увидеть это в документации по MmapBytesReader, это признак, CsvReader::new связывающий его аргумент.

cafce25 19.04.2024 23:27

Другие вопросы по теме