pub struct CsvItemReaderBuilder<I> { /* private fields */ }csv only.Expand description
A builder for configuring CSV item reading.
This builder allows you to customize the CSV reading behavior, including delimiter, terminator, and header handling.
§Design Pattern
This struct implements the Builder pattern, which allows for fluent, chainable
configuration of a CsvItemReader before creation. Each method returns self
to allow method chaining.
§Default Configuration
- Delimiter: comma (,)
- Terminator: CRLF (Windows-style line endings)
- Headers: disabled
- Trimming: All fields trimmed
§Examples
use spring_batch_rs::item::csv::csv_reader::CsvItemReaderBuilder;
use spring_batch_rs::core::item::ItemReader;
use serde::Deserialize;
use csv::Terminator;
#[derive(Deserialize)]
struct Person {
name: String,
age: u8,
}
// Custom CSV configuration
let reader = CsvItemReaderBuilder::<Person>::new()
.delimiter(b';') // Use semicolon as delimiter
.terminator(Terminator::Any(b'\n')) // Unix line endings
.has_headers(true) // First row contains headers
.from_reader("name;age\nAlice;30".as_bytes());Implementations§
Source§impl<I> CsvItemReaderBuilder<I>
impl<I> CsvItemReaderBuilder<I>
Sourcepub fn new() -> Self
pub fn new() -> Self
Creates a new CsvItemReaderBuilder with default configuration.
Default settings:
- Delimiter: comma (,)
- Terminator: CRLF (Windows-style line endings)
- Headers: disabled
§Examples
use spring_batch_rs::item::csv::csv_reader::CsvItemReaderBuilder;
use serde::Deserialize;
#[derive(Deserialize)]
struct Record {
field: String,
}
let builder = CsvItemReaderBuilder::<Record>::new();Sourcepub fn delimiter(self, delimiter: u8) -> Self
pub fn delimiter(self, delimiter: u8) -> Self
Sets the delimiter character for the CSV parsing.
§Parameters
delimiter: The character to use as a field delimiter
§Examples
use spring_batch_rs::item::csv::csv_reader::CsvItemReaderBuilder;
use serde::Deserialize;
#[derive(Deserialize)]
struct Record {
field: String,
}
// Use tab as delimiter
let builder = CsvItemReaderBuilder::<Record>::new()
.delimiter(b'\t');
// Use semicolon as delimiter
let builder = CsvItemReaderBuilder::<Record>::new()
.delimiter(b';');Sourcepub fn terminator(self, terminator: Terminator) -> Self
pub fn terminator(self, terminator: Terminator) -> Self
Sets the line terminator for the CSV parsing.
§Parameters
terminator: The line terminator to use
§Terminator Options
Terminator::CRLF: Windows-style line endings (default)Terminator::Any(byte): Custom terminator, oftenb'\n'for Unix-style
§Examples
use spring_batch_rs::item::csv::csv_reader::CsvItemReaderBuilder;
use csv::Terminator;
use serde::Deserialize;
#[derive(Deserialize)]
struct Record {
field: String,
}
// Use Unix-style line endings (LF)
let builder = CsvItemReaderBuilder::<Record>::new()
.terminator(Terminator::Any(b'\n'));Sourcepub fn has_headers(self, yes: bool) -> Self
pub fn has_headers(self, yes: bool) -> Self
Sets whether the CSV file has headers.
When enabled, the first row is treated as headers and is not returned as part of the data. The header names can be used to match fields in the deserialization process.
§Parameters
yes: Whether headers are present
§Deserialization Impact
When enabled, column names from headers can be matched to struct field names during deserialization. This is often more robust than relying on column order.
§Examples
use spring_batch_rs::item::csv::csv_reader::CsvItemReaderBuilder;
use serde::Deserialize;
#[derive(Deserialize)]
struct Record {
field: String,
}
// Enable headers (first row is column names)
let builder = CsvItemReaderBuilder::<Record>::new()
.has_headers(true);
// Disable headers (all rows are data)
let builder = CsvItemReaderBuilder::<Record>::new()
.has_headers(false);Sourcepub fn from_reader<R: Read>(self, rdr: R) -> CsvItemReader<R>
pub fn from_reader<R: Read>(self, rdr: R) -> CsvItemReader<R>
Creates a CsvItemReader from a reader.
This allows reading CSV data from any source that implements the Read trait,
such as files, strings, or network connections.
§Parameters
rdr: The reader containing CSV data
§Configuration Applied
The following configurations are applied:
- Trims all whitespace from fields
- Uses specified delimiter (default: comma)
- Uses specified terminator (default: CRLF)
- Handles headers according to configuration
- Strict parsing (not flexible) to identify formatting issues
§Examples
use spring_batch_rs::item::csv::csv_reader::CsvItemReaderBuilder;
use spring_batch_rs::core::item::ItemReader;
use serde::Deserialize;
use std::io::Cursor;
#[derive(Deserialize)]
struct Record {
id: u32,
name: String,
}
// Read from a string
let data = "id,name\n1,Alice\n2,Bob";
let reader = CsvItemReaderBuilder::<Record>::new()
.has_headers(true)
.from_reader(data.as_bytes());
// Or read from a Cursor
let cursor = Cursor::new("id,name\n1,Alice\n2,Bob");
let reader = CsvItemReaderBuilder::<Record>::new()
.has_headers(true)
.from_reader(cursor);Sourcepub fn from_path<R: AsRef<Path>>(self, path: R) -> CsvItemReader<File>
pub fn from_path<R: AsRef<Path>>(self, path: R) -> CsvItemReader<File>
Creates a CsvItemReader from a file path.
§Parameters
path: The path to the CSV file
§Returns
A new CsvItemReader configured to read from the specified file
§Panics
Panics if the file cannot be opened
§Error Handling
This method panics immediately if the file cannot be opened, which is appropriate
for initialization failures. Subsequent reading errors are returned as Result values
from the read method.
§Examples
use spring_batch_rs::item::csv::csv_reader::CsvItemReaderBuilder;
use spring_batch_rs::core::item::ItemReader;
use serde::Deserialize;
#[derive(Deserialize)]
struct Record {
id: u32,
name: String,
}
// Read from a file
let reader = CsvItemReaderBuilder::<Record>::new()
.has_headers(true)
.from_path("data.csv");
// Process records
let mut records: Vec<Record> = Vec::new();
while let Some(record) = ItemReader::<Record>::read(&reader).unwrap() {
println!("ID: {}, Name: {}", record.id, record.name);
records.push(record);
}Trait Implementations§
Source§impl<I: Default> Default for CsvItemReaderBuilder<I>
impl<I: Default> Default for CsvItemReaderBuilder<I>
Source§fn default() -> CsvItemReaderBuilder<I>
fn default() -> CsvItemReaderBuilder<I>
Auto Trait Implementations§
impl<I> Freeze for CsvItemReaderBuilder<I>
impl<I> RefUnwindSafe for CsvItemReaderBuilder<I>where
I: RefUnwindSafe,
impl<I> Send for CsvItemReaderBuilder<I>where
I: Send,
impl<I> Sync for CsvItemReaderBuilder<I>where
I: Sync,
impl<I> Unpin for CsvItemReaderBuilder<I>where
I: Unpin,
impl<I> UnsafeUnpin for CsvItemReaderBuilder<I>
impl<I> UnwindSafe for CsvItemReaderBuilder<I>where
I: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.