polars_io/csv/write/
options.rs

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