如何按行获取 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)
}
我有一个包含三行代码的文本文件,需要提取每一行并用“,”分隔,这样我就可以从每一行中提取片段并将它们放入 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)
}