如何按行获取 txt 信息并将每一行拆分为单独的 类

How can I get the txt information by line and split each line for separate classes

我有一个包含三行代码的文本文件,需要提取每一行并用“,”分隔,这样我就可以从每一行中提取片段并将它们放入 class。每行我将有一个 class。

这是我到目前为止想出的。我只是觉得它的代码太多了,想找到一种简单的方法来做到这一点。

文本文件如下所示

character, stats, stats, stats
weapon, stats
armor, stats

我的第一行代码如下所示

class CharacterFight(
       var name : String,
       var race : String,
       var hitpoints :Int,
       var strength : Int,
       var agility : Int,

){
override fun toString(): String {
       return """Character
           Name: ${name}
           Race: ${race}
           Hitpoints :${hitpoints}
           Strength: ${strength}
           Agility: ${agility}
       """.trimMargin()
   }
}
var charactersStats = mutableListOf<CharacterFight>()
var charStats = mutableListOf<String>()
   val fileName: String = "src/main/kotlin/gimli.txt"
   var  characterInfo = mutableListOf<String>()
var lines = File(fileName).readLines()
   for (line in lines){
       val pieces  = line.split("\n")
       characterInfo.add(line)
   }
    charStats.add(characterInfo[0])
   for (stat in charStats){
       var statpieces = stat.split(",")
      var charpieces = CharacterFight(statpieces[0],statpieces[1],statpieces[2].toInt(),statpieces[3].toInt(),statpieces[4].toInt)
       charactersStats.add(charpieces)
   }```

为避免样板 toString() 代码考虑使用 data classes:

data class CharacterFight(var name: String, var race: String, var hitpoints: Int, var strength: Int, var agility: Int)

假设另外两个类是

data class Weapon(val name: String, val value: Int)
data class Armor(val name: String, val value: Int)

CSV反序列化可以通过以下方式完成(使用destructuring declarations使代码更具可读性,但仍然无法避免对某些传递参数进行显式toInt()转换):

fun deserializeCSV(fileName: String): Triple<CharacterFight, Weapon, Armor> {
    val (characterInfo, weaponInfo, armorInfo) = File(fileName).readLines().map { it.split(",") }
    val character = run { //create separate scope to avoid clash of name variables
        val (name, race, hitpointsStr, strengthStr, agilityStr) = characterInfo
        CharacterFight(name, race, hitpointsStr.toInt(), strengthStr.toInt(), agilityStr.toInt())
    }
    val weapon = run { //create separate scope to avoid clash of name variables
        val (name, valueStr) = weaponInfo
        Weapon(name, valueStr.toInt())
    }
    val armor = run { //create separate scope to avoid clash of name variables
        val (name, valueStr) = armorInfo
        Armor(name, valueStr.toInt())
    }
    return Triple(character, weapon, armor)
}

如果提供的 CSV 格式不是硬性要求,我建议改用 JSON:

{"name":"Gimli","race":"dwarf","hitpoints":90,"strength":40,"agility":3}
{"name":"Axe","value":25}
{"name":"Plate male","value":85}

然后在 kotlinx.serialization 库反序列化的帮助下相当容易:

//don't forget to add `@Serializable` annotation to all deserializable classes

fun deserializeJSON(fileName: String): Triple<CharacterFight, Weapon, Armor> {
    val (characterInfo, weaponInfo, armorInfo) = File(fileName).readLines()
    val character: CharacterFight = Json.decodeFromString(characterInfo)
    val weapon: Weapon = Json.decodeFromString(weaponInfo)
    val armor: Armor = Json.decodeFromString(armorInfo)
    return Triple(character, weapon, armor)
}