mirror of
https://github.com/ankitects/anki.git
synced 2025-09-25 09:16:38 -04:00
Don't use doubly buffered reader in csv
This commit is contained in:
parent
bf74ec8203
commit
f7ac4497b4
1 changed files with 18 additions and 14 deletions
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
fs::File,
|
fs::File,
|
||||||
io::{BufRead, BufReader, Read, Seek},
|
io::{BufRead, BufReader, Read, Seek, SeekFrom},
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
@ -41,33 +41,37 @@ impl Collection {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn deserialize_csv(
|
fn deserialize_csv(
|
||||||
reader: impl Read + Seek,
|
mut reader: impl Read + Seek,
|
||||||
columns: &[Column],
|
columns: &[Column],
|
||||||
fields_len: usize,
|
fields_len: usize,
|
||||||
delimiter: u8,
|
delimiter: u8,
|
||||||
) -> Result<Vec<ForeignNote>> {
|
) -> Result<Vec<ForeignNote>> {
|
||||||
let mut reader = csv::ReaderBuilder::new()
|
remove_tags_line_from_reader(&mut reader)?;
|
||||||
|
let mut csv_reader = csv::ReaderBuilder::new()
|
||||||
.has_headers(false)
|
.has_headers(false)
|
||||||
.flexible(true)
|
.flexible(true)
|
||||||
.comment(Some(b'#'))
|
.comment(Some(b'#'))
|
||||||
.delimiter(delimiter)
|
.delimiter(delimiter)
|
||||||
.trim(csv::Trim::All)
|
.trim(csv::Trim::All)
|
||||||
.from_reader(reader_without_tags_line(reader)?);
|
.from_reader(reader);
|
||||||
deserialize_csv_reader(&mut reader, columns, fields_len)
|
deserialize_csv_reader(&mut csv_reader, columns, fields_len)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a reader with the first line stripped if it starts with "tags:",
|
/// If the reader's first line starts with "tags:", which is allowed for historic
|
||||||
/// which is allowed for historic reasons.
|
/// reasons, seek to the second line.
|
||||||
fn reader_without_tags_line(reader: impl Read + Seek) -> Result<impl Read> {
|
fn remove_tags_line_from_reader(reader: &mut (impl Read + Seek)) -> Result<()> {
|
||||||
// FIXME: shouldn't pass a buffered reader to csv
|
|
||||||
// https://docs.rs/csv/latest/csv/struct.ReaderBuilder.html#method.from_reader
|
|
||||||
let mut buf_reader = BufReader::new(reader);
|
let mut buf_reader = BufReader::new(reader);
|
||||||
let mut first_line = String::new();
|
let mut first_line = String::new();
|
||||||
buf_reader.read_line(&mut first_line)?;
|
buf_reader.read_line(&mut first_line)?;
|
||||||
if !first_line.starts_with("tags:") {
|
let offset = if first_line.starts_with("tags:") {
|
||||||
buf_reader.rewind()?;
|
first_line.as_bytes().len()
|
||||||
}
|
} else {
|
||||||
Ok(buf_reader)
|
0
|
||||||
|
};
|
||||||
|
buf_reader
|
||||||
|
.into_inner()
|
||||||
|
.seek(SeekFrom::Start(offset as u64))?;
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn deserialize_csv_reader(
|
fn deserialize_csv_reader(
|
||||||
|
|
Loading…
Reference in a new issue