Files and Text Processing
Parsing Key-Value Text
Turn key=value lines into a lookup map.
key-value
Each `key=value` line is split at the first `=` and stored in a map. Later code looks up a value by its key with a safe default.
Parsing Key-Value Text
KeyValue.scala
Replay: real traced execution (multi-file project)
object Main {
def main(args: Array[String]): Unit = {
val lookup = "host"
val text = "host=local\nport=8080\nuser=ann"
val lines = text.split("\n").toList
var config = Map[String, String]()
for (line <- lines) {
val eq = line.indexOf("=")
val k = line.substring(0, eq)
val v = line.substring(eq + 1)
config = config + (k -> v)
}
val value = config.getOrElse(lookup, "?")
println("size=" + config.size)
println("value=" + value)
}
}
object Main {
def main(args: Array[String]): Unit = {
val lookup = "port"
val text = "host=local\nport=8080\nuser=ann"
val lines = text.split("\n").toList
var config = Map[String, String]()
for (line <- lines) {
val eq = line.indexOf("=")
val k = line.substring(0, eq)
val v = line.substring(eq + 1)
config = config + (k -> v)
}
val value = config.getOrElse(lookup, "?")
println("size=" + config.size)
println("value=" + value)
}
}
object Main {
def main(args: Array[String]): Unit = {
val lookup = "user"
val text = "host=local\nport=8080\nuser=ann"
val lines = text.split("\n").toList
var config = Map[String, String]()
for (line <- lines) {
val eq = line.indexOf("=")
val k = line.substring(0, eq)
val v = line.substring(eq + 1)
config = config + (k -> v)
}
val value = config.getOrElse(lookup, "?")
println("size=" + config.size)
println("value=" + value)
}
}
lookup ← host, text ← host=local port=8080 user=ann, lines ← List(host=local, port=8080, user=ann)
1object Main {2 def main(args: Array[String]): Unit = {3 val lookup→ host = "host" //@lookup="port", "user"4 val text→ host=local port=8080 user=ann = "host=local\nport=8080\nuser=ann"5 val lines→ List(host=local, port=8080, user=ann) = texthost=local port=8080 user=ann.split("\n").toList6 var config→ Map() = Map[String, String]()7 for (line <- lines) {8 val eq = line.indexOf("=")eq ← 4, k ← host, v ← local, config ← Map(host -> local)
pass 1 of 36var config = Map[String, String]()7for (linehost=local <- linesList(host=local, port=8080, user=ann)) {8 val eq→ 4 = linehost=local.indexOf("=")9 val k→ host = linehost=local.substring(0, eq4)10 val v→ local = linehost=local.substring(eq4 + 1)11 config→ Map(host -> local) = config + (khost -> vlocal)12}13val value = config.getOrElse(lookup, "?")All 3 passes — pass 1 is the card above pass lineeqkvconfig1 host=local 4 host local Map() → Map(host -> local) 2 port=8080 4 port 8080 Map(host -> local) → Map(host -> local, port -> 8080) 3 user=ann 4 user ann Map(host -> local, port -> 8080) → Map(host -> local, port -> 8080, user -> ann) value ← local
12 }13 val value→ local = configMap(host -> local, port -> 8080, user -> ann).getOrElse(lookuphost, "?")1415 println("size=" + config.size3)16 println("value=" + valuelocal)17 }18}outputsize=3 value=local
lookup ← port, text ← host=local port=8080 user=ann, lines ← List(host=local, port=8080, user=ann)
1object Main {2 def main(args: Array[String]): Unit = {3 val lookup→ port = "port"4 val text→ host=local port=8080 user=ann = "host=local\nport=8080\nuser=ann"5 val lines→ List(host=local, port=8080, user=ann) = texthost=local port=8080 user=ann.split("\n").toList6 var config→ Map() = Map[String, String]()7 for (line <- lines) {8 val eq = line.indexOf("=")eq ← 4, k ← host, v ← local, config ← Map(host -> local)
pass 1 of 36var config = Map[String, String]()7for (linehost=local <- linesList(host=local, port=8080, user=ann)) {8 val eq→ 4 = linehost=local.indexOf("=")9 val k→ host = linehost=local.substring(0, eq4)10 val v→ local = linehost=local.substring(eq4 + 1)11 config→ Map(host -> local) = config + (khost -> vlocal)12}13val value = config.getOrElse(lookup, "?")All 3 passes — pass 1 is the card above pass lineeqkvconfig1 host=local 4 host local Map() → Map(host -> local) 2 port=8080 4 port 8080 Map(host -> local) → Map(host -> local, port -> 8080) 3 user=ann 4 user ann Map(host -> local, port -> 8080) → Map(host -> local, port -> 8080, user -> ann) value ← 8080
12 }13 val value→ 8080 = configMap(host -> local, port -> 8080, user -> ann).getOrElse(lookupport, "?")1415 println("size=" + config.size3)16 println("value=" + value8080)17 }18}outputsize=3 value=8080
lookup ← user, text ← host=local port=8080 user=ann, lines ← List(host=local, port=8080, user=ann)
1object Main {2 def main(args: Array[String]): Unit = {3 val lookup→ user = "user"4 val text→ host=local port=8080 user=ann = "host=local\nport=8080\nuser=ann"5 val lines→ List(host=local, port=8080, user=ann) = texthost=local port=8080 user=ann.split("\n").toList6 var config→ Map() = Map[String, String]()7 for (line <- lines) {8 val eq = line.indexOf("=")eq ← 4, k ← host, v ← local, config ← Map(host -> local)
pass 1 of 36var config = Map[String, String]()7for (linehost=local <- linesList(host=local, port=8080, user=ann)) {8 val eq→ 4 = linehost=local.indexOf("=")9 val k→ host = linehost=local.substring(0, eq4)10 val v→ local = linehost=local.substring(eq4 + 1)11 config→ Map(host -> local) = config + (khost -> vlocal)12}13val value = config.getOrElse(lookup, "?")All 3 passes — pass 1 is the card above pass lineeqkvconfig1 host=local 4 host local Map() → Map(host -> local) 2 port=8080 4 port 8080 Map(host -> local) → Map(host -> local, port -> 8080) 3 user=ann 4 user ann Map(host -> local, port -> 8080) → Map(host -> local, port -> 8080, user -> ann) value ← ann
12 }13 val value→ ann = configMap(host -> local, port -> 8080, user -> ann).getOrElse(lookupuser, "?")1415 println("size=" + config.size3)16 println("value=" + valueann)17 }18}outputsize=3 value=ann