Aligned plain-text table renderer for the terminal
Kotlin
fun renderTable(headers: List<String>, rows: List<List<String>>): String {
val widths = headers.indices.map { col ->
(rows.map { it.getOrElse(col) { "" } } + headers[col]).maxOf { it.length }
}
fun line(values: List<String>) = values
.mapIndexed { i, v -> v.padEnd(widths[i]) }
.joinToString(" | ", "| ", " |")
val out = StringBuilder()
out.appendLine(line(headers))
out.appendLine(widths.joinToString("+", "+", "+") { "-".repeat(it + 2) })
rows.forEach { out.appendLine(line(it)) }
return out.toString()
}
val table = renderTable(listOf("id", "name"), listOf(listOf("1", "kotlin"), listOf("22", "c")))
print(table)