Skip to content

blackmo18/kotlin-grass

Repository files navigation

Kotlin-Grass

Kotlin Parser: 0.8.0 Core: 0.8.0 License: Apache License 2.0 CodeFactor CodeFactor

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:

//doyaaaaaken's kotlin-csv
implementation("com.github.doyaaaaaken:kotlin-csv-jvm:0.15.2")
//kotlin-grass
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")
    }

    // or

    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