The following types have CellCodec instances available out of the box:
java.util.DateThere also is a default CellCodec instance available for Date, but this one is slightly more complicated. There
are so many different ways of writing dates that there is no reasonable default behaviour - one might argue that
defaulting to ISO 8601 might make sense, but there doesn’t appear to be a sane way of implementing that in Java’s
crusty date / time API.
Instead of providing a default implementation that is likely going to be incorrect for most people, kantan.csv
provides easy ways of creating CellEncoder, CellDecoder and CellCodec instances provided you can create a
DateFormat for you dates:
EitherFor any two types A and B that each have a CellEncoder, there exists a
CellEncoder[Either[A, B]].
By the same token, for any two types A and B that each have a CellDecoder, there exists a
CellDecoder[Either[A, B]].
This is useful for dodgy CSV data where the type of a column is not well defined - it might sometimes be an int, sometimes a boolean, for example.
OptionFor any type A that as a CellEncoder, there exists a CellEncoder[Option[A]].
By the same token, for any type A that as a CellDecoder, there exists a CellDecoder[Option[A]].
This is useful for CSV data where some fields are optional and an empty value is legal.
It’s important to realise that these instances compose automatically. Int has a CellDecoder, which means that
Option[Int] does to. Boolean has a CellDecoder, which means that
Either[Option[Int], Boolean] does
too.
For any type A that has a CellEncoder, there exists a RowEncoder[A].
By the same token, for any type A that has a CellDecoder, there exists a RowDecoder[A].
This is useful for CSV data where each row is composed of a single column.
Tuples of any arity, provided they’re composed of types that all have a CellEncoder, have a RowEncoder.
By the same token, tuples of any arity, provided they’re composed of types that all have a CellDecoder, have a
RowDecoder.
For example, (Int, String, Either[Boolean, Option[Double]]) has both a RowEncoder and a RowDecoder.
For any first order type F that has a CanBuildFrom and type A that has a CellDecoder, there exists a
RowDecoder[F[A]].
For any type F that extends TraversableOnce and A that has a CellEncoder, there exists a
RowEncoder[F[A]].
This is useful for CSV data where each row is composed of homogeneous data.
For any two types A and B that each have a RowEncoder, there exists a
RowEncoder[Either[A, B]].
By the same token, for any two types A and B that each have a RowDecoder, there exists a
RowDecoder[Either[A, B]].
This is useful for dodgy CSV data where the type of a row is not well defined - it might sometimes be a Cat, sometimes
a Dog, for example.
For any type A that as a RowEncoder, there exists a RowEncoder[Option[A]].
By the same token, for any type A that as a RowDecoder, there exists a RowDecoder[Option[A]].
This is useful for CSV data where some rows might be empty. Note that this is a bit of a dodgy case: the RFC states
that empty rows should be ignored, so serializing a collection that contains None values and then deserializing the
result will not yield the original list.
CsvSourceThe following types have an instance of CsvSource out of the box:
CsvSinkThe following types have an instance of CsvSink out of the box: