我有一个简单的问题:
我想要一个解析文本结果的值映射:
example.txt
Anna
James
Katy
因此,它应该是大地图 - 像这样:
user_1 : Anna
user_2 : James
user_3 : Katy
我想使用case类将它与解析逻辑分开保存:
case class UserMap(userMap: Map[String, String])
所以,我开始解析它,我需要一些熟悉的东西:
(pseudo-scala)
def parseTxt: Parser[UserMap] = ".*".r ^^ {
case res => User(("user_1" -> res))
}
这里最好的方法是什么?在这种情况下如何使用地图?谢谢
答案 0 :(得分:1)
如果您想以任何价格使用Scala解析器组合器,那么这是一个解决方案:
import scala.util.parsing.combinator.RegexParsers
object SO29918479 extends App {
case class UserMap(userMap: Map[String, String])
object UserParser extends RegexParsers {
def user: Parser[String] = """[a-zA-Z]+""".r
def users: Parser[List[String]] = (user ~ "\n".?).* ^^ ( _.map(_._1))
def userMap: Parser[UserMap] = users ^^ { a =>
UserMap(a.zipWithIndex.map({case (user, index) => s"user_$index" -> user}).toMap)
}
}
println(UserParser.parse(UserParser.userMap, "Anna\nJames\nKaty"))
}