Kotlin中如何从文件读取的可变列表调用特定行与列?
解决方案:访问文件特定行与列并映射到类对象
你当前代码的问题在于:lines是useLines lambda的局部变量,lambda执行完毕后就无法再访问它。但你已经把所有行读取到了myList中,后续操作应该直接基于myList来进行。
方法一:基于已读取的列表操作
直接使用myList访问特定行,再拆分列进行判断:
import java.io.File class Inventory(var fileName: String) { override fun toString(): String { return fileName.trimIndent() } init { val myList = mutableListOf<String>() File(fileName).useLines { lines -> myList.addAll(lines) } // 示例:遍历所有行,判断第一列内容为指定值时创建类对象 for (line in myList) { // 根据实际文件的列分隔符拆分(比如逗号、制表符"\t") val columns = line.split(",") // 避免索引越界,先判断列数是否足够 if (columns.size >= 1 && columns[0] == "--column1--") { // 这里执行你的类对象创建逻辑 // val item = YourCustomClass(columns[0], columns[1], ...) } } // 若要访问特定行,直接通过索引获取 // 比如获取第二行(索引从0开始) if (myList.size > 1) { val targetLine = myList[1] val targetColumns = targetLine.split(",") // 处理该行 } } }
方法二:流式处理(更节省内存)
如果文件较大,不需要把所有行都加载到内存,可以直接在useLines的lambda里完成处理,无需额外存储列表:
import java.io.File class Inventory(var fileName: String) { override fun toString(): String { return fileName.trimIndent() } init { File(fileName).useLines { lines -> // 遍历每行,直接处理 lines.forEach { line -> val columns = line.split(",") if (columns.size >= 1 && columns[0] == "--column1--") { // 创建类对象并处理 // val item = YourCustomClass(columns[0], columns[1], ...) } } // 若要获取特定行,可以通过index判断 val targetLine = lines.elementAtOrNull(1) // 获取第二行,不存在则返回null targetLine?.let { val columns = it.split(",") // 处理该行 } } } }
关键注意事项
- 列拆分的分隔符要和你的实际文件格式匹配,比如CSV用逗号,TSV用制表符
\t。 - 处理列时一定要先判断列数是否足够,避免
IndexOutOfBoundsException。 - 若文件有表头,可通过
drop(1)跳过第一行,比如myList.drop(1).forEach { ... }。
内容的提问来源于stack exchange,提问作者msLA_Mac
相关产品推荐
相关产品推荐

