Path: blob/main/crates/polars-io/src/csv/write/options.rs
8424 views
use std::num::NonZeroUsize;1use std::sync::Arc;23use polars_utils::pl_str::PlSmallStr;4#[cfg(feature = "serde")]5use serde::{Deserialize, Serialize};67use crate::ExternalCompression;89/// Options for writing CSV files.10#[derive(Clone, Debug, Eq, Hash, PartialEq)]11#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]12#[cfg_attr(feature = "dsl-schema", derive(schemars::JsonSchema))]13pub struct CsvWriterOptions {14pub include_bom: bool,15#[cfg_attr(feature = "serde", serde(default))]16pub compression: ExternalCompression,17#[cfg_attr(feature = "serde", serde(default))]18pub check_extension: bool,19pub include_header: bool,20pub batch_size: NonZeroUsize,21pub serialize_options: Arc<SerializeOptions>,22}2324impl Default for CsvWriterOptions {25fn default() -> Self {26Self {27include_bom: false,28compression: ExternalCompression::default(),29check_extension: true,30include_header: true,31batch_size: NonZeroUsize::new(1024).unwrap(),32serialize_options: SerializeOptions::default().into(),33}34}35}3637/// Options to serialize logical types to CSV.38///39/// The default is to format times and dates as `chrono` crate formats them.40#[derive(Clone, Debug, Eq, Hash, PartialEq)]41#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]42#[cfg_attr(feature = "dsl-schema", derive(schemars::JsonSchema))]43pub struct SerializeOptions {44/// Used for [`DataType::Date`](polars_core::datatypes::DataType::Date).45pub date_format: Option<PlSmallStr>,46/// Used for [`DataType::Time`](polars_core::datatypes::DataType::Time).47pub time_format: Option<PlSmallStr>,48/// Used for [`DataType::Datetime`](polars_core::datatypes::DataType::Datetime).49pub datetime_format: Option<PlSmallStr>,50/// Used for [`DataType::Float64`](polars_core::datatypes::DataType::Float64)51/// and [`DataType::Float32`](polars_core::datatypes::DataType::Float32).52pub float_scientific: Option<bool>,53pub float_precision: Option<usize>,54/// Use comma as the decimal separator.55pub decimal_comma: bool,56/// Used as separator.57pub separator: u8,58/// Quoting character.59pub quote_char: u8,60/// Null value representation.61pub null: PlSmallStr,62/// String appended after every row.63pub line_terminator: PlSmallStr,64/// When to insert quotes.65pub quote_style: QuoteStyle,66}6768impl Default for SerializeOptions {69fn default() -> Self {70Self {71date_format: None,72time_format: None,73datetime_format: None,74float_scientific: None,75float_precision: None,76decimal_comma: false,77separator: b',',78quote_char: b'"',79null: PlSmallStr::EMPTY,80line_terminator: "\n".into(),81quote_style: Default::default(),82}83}84}8586/// Quote style indicating when to insert quotes around a field.87#[derive(Copy, Clone, Debug, Default, Eq, Hash, PartialEq)]88#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]89#[cfg_attr(feature = "dsl-schema", derive(schemars::JsonSchema))]90pub enum QuoteStyle {91/// Quote fields only when necessary.92///93/// Quotes are necessary when fields contain a quote, separator or record terminator.94/// Quotes are also necessary when writing an empty record (which is indistinguishable95/// from arecord with one empty field).96/// This is the default.97#[default]98Necessary,99/// Quote every field. Always.100Always,101/// Quote non-numeric fields.102///103/// When writing a field that does not parse as a valid float or integer,104/// quotes will be used even if they aren't strictly necessary.105NonNumeric,106/// Never quote any fields, even if it would produce invalid CSV data.107Never,108}109110111