Как сделать чтение csv файла в Kotlin. Используем класс CsvReader для работы с csv файлами. И какие ошибки могут появляться из-за некорректного csv файла.
Чтение csv файла в Kotlin с помощью класса CsvReader
import android.content.Context
class CsvReader(val context: Context) {
// Открыть файл и получить всё содержимое
private fun open(fileName: String): String {
val inputStream = this.context.assets.open(fileName)
return inputStream.bufferedReader().use { it.readText() }
}
// Заполнить csv данными ArrayList
private fun fullArrayList(csvData: String): ArrayList<Array<String>> {
val simpleList = arrayListOf<Array<String>>()
val rows: List<String> = csvData.split("\n").map { it.trim() }
for (row in rows) {
val cells: List<String> = row.split(";").map { it.trim() }
val cellInfo = Array(4) { "it = $it" }
cellInfo[0] = cells[0]
cellInfo[1] = cells[1]
cellInfo[2] = cells[2]
cellInfo[3] = "0"
simpleList.add(cellInfo)
}
return simpleList
}
// Прочитать данных из csv файла в массив
fun read(fileName: String): ArrayList<Array<String>> {
val csvData = this.open(fileName)
return fullArrayList(csvData)
}
}
Если код показался слишком запутанным, то есть отдельное описание как создавать динамические массивы в Kotlin.
Как использовать класс CsvReader.
Csv файл располагаем в папке:
app/assets/example.csv
Создаём объект класса. Передаём параметр context. Например, this — это контекст текущего слоя (layout), в данном случае MainActivity.
val fileReader = CsvReader(this)
return fileReader.loadCsvFileSignInfo("example.csv")
Из особенностей класса
Тут строго указаны делимитеры. Если их вынести переменными, то класс станет более универсальным. Это уже на своё усмотрение.
При чтении csv файла бывают ошибки с разделяющими символами. Лишний делимитер вызовет ошибку. Некоторые языки прощают такой подход, но не Kotlin.