Csv File to Kotlin Data Class Parser
Currently, it requires to have @ExperimentalStdlibApi
on the class/method using this Library.
Requires kotlin-csv by doyaaaaaken for reading csv file.
Features
1. Simple And Direct
- No hard configuration
- No invasive annotations to data class
- Custom mapping
- Nullable Data Types
2. Primitive Types
- Short
- Int
- Long
- Float
- Double
- Boolean
- String
3. Support for Java 8 Date Time Apis
- LocalTime
- LocalDateTime
- LocalDate
- Custom Formatting
Usage
Gradle DSL:
implementation("com.github.doyaaaaaken:kotlin-csv-jvm:0.15.2")
implementation("io.github.blackmo18:kotlin-grass-core-jvm:1.0.0")
implementation("io.github.blackmo18:kotlin-grass-parser-jvm:0.8.0")
Maven:
<dependency>
<groupId>com.github.doyaaaaaken</groupId>
<artifactId>kotlin-csv-jvm</artifactId>
<version>0.15.2</version>
</dependency>
<dependency>
<groupId>io.github.blackmo18</groupId>
<artifactId>kotlin-grass-core-jvm</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>io.github.blackmo18</groupId>
<artifactId>kotlin-grass-parser-jvm</artifactId>
<version>0.8.0</version>
</dependency>
Examples
CSV file
short | int | long | float | double | boolean | string |
---|
0 | 1 | 2 | 3.0 | 4.0 | true | hello |
Declaring data class
data class PrimitiveTypes(
val short: Short,
val int: Int,
val long: Long,
val float: Float,
val double: Double,
val boolean: Boolean,
val string: String
)
Nullable Data Types
If a variable in your data class is a nullable, all you have to do is mark it with ?
data class NullableData(
val nullableString: String?,
val nullableInt: Int? = null,
...
)
Parsing to data class
val csvContents = csvReader().readAllWithHeader(file)
val dataClasses = grass<PrimitiveTypes>().harvest(csvContents)
Parsing to data class using Kotlin Flow
val contents = File("file/path").inputStream()
val dataClasses: Flow<PrimitiveTypes> = csvReader().openAsync(contents) {
val data = readAllWithHeaderAsSequence().asFlow()
grass<PrimitiveTypes>().harvest(data)
}
Custom Configuration
Option | default value | description |
---|
dateFormat | yyyy-MM-dd | date format |
timeFormat | HH:mm | time format |
dateTimeSeparator | (space) | date time separator |
trimWhiteSpace | true | trims white spaces on csv entries |
ignoreUnknownFields | false | ignore unknown / unmapped fields in input |
caseSensitive | true | case sensitive header matching |
customKeyMap | null | Map<String,String> custom key mapping, priority if not empty or null |
customKeyMapDataProperty | null | Map<String, KProperty<*>> custom key mapping |
Java Date Time API Support
csv file
time | datetime | date |
---|
12:00 | 2020-12-31 12:00 | 2020-12-31 |
Date and Time Types
Import the following extension library
implementation("io.github.blackmo18:kotlin-grass-date-time-jvm:0.8.0")
data class DateTimeTypes(
val time: LocalTime,
val datetime: LocalDateTime,
val date: LocalDate,
)
Customize Formatting
val grass = grass<DateTimeTypes> {
dateFormat = "MM-dd-yyyy"
timeFormat = "HH:mm:ss"
dateTimeSeparator = "/"
customDataTypes = arrayListOf(Java8DateTime)
}
Custom Mapping Support
CSV file
hour | birthdate |
---|
12:00 | 2020-12-31 |
Code
data class DateTime(
val time: LocalTime,
val date: LocalDate,
)
val grass = grass<DateTimeTypes> {
customKeyMap = mapOf("hour" to "time", "birthdate" to "date")
}
val grass = grass<DateTimeTypes> {
customKeyMapDataProperty = mapOf("hour" to DateTime::time, "birthdate" to DateTime::date)
}
🤝 Contributing
Contributions, issues and feature requests are welcome!
Feel free to check issues page.
Changelog
Show your support
Give a ⭐️ if this project helped you!
📝 License
Copyright © 2020 blackmo18.
This project is Apache License 2.0 licensed.
This project inspired ❤️ by kotlin-csv