Kotlin CSV
last modified January 29, 2024
This article shows how to read and write CSV files in Kotlin. We use the Opencsv and kotlin-csv libraries.
CSV (Comma Separated Values) format is a very popular import and export format used in spreadsheets and databases.
Each line in a CSV file is a data record. Each record consists of one or more fields, separated by commas. Despite CSV format being a very simple format, there can be many differecies, such as different delimiters, new lines, or quoting characters.
CSVReader
The following example reads numbers from a CSV file.
3,5,6,2,1,7,8 4,5,7,3,2,8,9
We have two records of data in the numbers.csv file.
package com.zetcode
import com.opencsv.CSVReader
import java.io.FileReader
import java.nio.charset.StandardCharsets
fun main() {
val fileName = "src/main/resources/numbers.csv"
val fr = FileReader(fileName, StandardCharsets.UTF_8)
fr.use {
val reader = CSVReader(fr)
reader.use { r ->
var line = r.readNext()
while (line != null) {
line.forEach {
print(" $it")
}
println()
line = r.readNext()
}
}
}
}
The example reads numbers from the numbers.csv file and prints
them to the console.
val fileName = "src/main/resources/numbers.csv"
The file is located in the src/main/resources directory.
val reader = CSVReader(fr)
The CSVReader is a class used for reading CSV files.
var line = r.readNext()
while (line != null) {
line.forEach {
print(" $it")
}
println()
line = r.readNext()
}
We iterate through the reader and print the value to the terminal. The
readNext method reads the next line from the buffer and converts
to a string array.
Read CSV with different separator
Despite its name, CSV files can be separated with a delimiter other than a comma. The following example shows how to read numbers separated by a pipe | character.
1|2|3|4|5 6|7|3|9|8 9|1|1|0|2
We have three rows of numbers separated with the | character.
package com.zetcode
import com.opencsv.CSVParserBuilder
import com.opencsv.CSVReaderBuilder
import java.nio.charset.StandardCharsets
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths
fun main() {
val fileName = "src/main/resources/numbers.csv"
val myPath: Path = Paths.get(fileName)
val parser = CSVParserBuilder().withSeparator('|').build()
Files.newBufferedReader(myPath, StandardCharsets.UTF_8).use { br ->
CSVReaderBuilder(br).withCSVParser(parser)
.build().use { reader ->
val rows = reader.readAll()
for (row in rows) {
for (e in row) {
print("$e ")
}
println()
}
}
}
}
The example reads values from the numbers.csv file and prints them
to the console.
val parser = CSVParserBuilder().withSeparator('|').build()
A CSVParser with specific parser character is created.
Files.newBufferedReader(myPath, StandardCharsets.UTF_8).use { br ->
CSVReaderBuilder(br).withCSVParser(parser)
.build().use { reader ->
A CSVReader is created with CSVReaderBuilder.
val rows = reader.readAll()
We read all the elements into a list in one shot with the readAll
method. This method should not be used for large files.
for (row in rows) {
for (e in row) {
print("$e ")
}
println()
}
We go over the data.
CSVWriter
The CSVWriter class is used to write data to a CSV file.
package com.zetcode
import com.opencsv.CSVWriter
import java.io.FileOutputStream
import java.io.OutputStreamWriter
import java.nio.charset.StandardCharsets
fun main() {
val entries = arrayOf("book", "coin", "pencil", "cup")
val fileName = "src/main/resources/items.csv"
FileOutputStream(fileName).use { fos ->
OutputStreamWriter(fos, StandardCharsets.UTF_8).use { osw ->
CSVWriter(osw).use { writer ->
writer.writeNext(
entries
)
}
}
}
}
The example writes data from an array to the items.csv file.
The file is written into the project root directory. The writeNext
method writes an array of elements to the file.
Read/Write CSV with kotlin-csv
In the next example, we use the kotlin-csv library to read CSV
data.
package com.zetcode
import com.github.doyaaaaaken.kotlincsv.dsl.csvReader
fun main() {
csvReader().open("src/main/resources/numbers.csv") {
readAllAsSequence().forEach { row ->
for (e in row) {
print("$e ")
}
println()
}
}
}
We read data from the numbers.csv file.
In the next example, we write CSV data.
package com.zetcode
import com.github.doyaaaaaken.kotlincsv.dsl.csvWriter
fun main() {
val rows = listOf(listOf(1, 2, 3), listOf(4, 5, 6))
val fileName = "src/main/resources/data.csv"
csvWriter().open(fileName) {
rows.forEach { row ->
writeRow(row)
}
}
}
A list of lists is written to the data.csv file.
Source
In this article we have showed how to work with CSV in Kotlin.
Author
List all Kotlin tutorials.