[英]Scala: How to apply the pattern matching function to a csv file which contains the below mentioned values
def matchcase(x:String):Int = x match{
case "Iris-setosa" => 10
case "Iris-virginica" => 20
case "Iris-versicolor"=> 30
case _ => 0
csv文件中的示例数据如下:
1,5.1,3.5,1.4,0.2,Iris-setosa
2,4.9,3,1.4,0.2,Iris-setosa
3,4.7,3.2,1.3,0.2,Iris-setosa
51,7,3.2,4.7,1.4,Iris-versicolor
52,6.4,3.2,4.5,1.5,Iris-versicolor
53,6.9,3.1,4.9,1.5,Iris-versicolor
103,7.1,3,5.9,2.1,Iris-virginica
104,6.3,2.9,5.6,1.8,Iris-virginica
105,6.5,3,5.8,2.2,Iris-virginica
在带有正则表达式的Scala中使用提取器模式
鉴于正则表达式
val regex = "[[0-9]|,|\\.]+([[a-zA-z]|\\-]+)".r
现在Just模式逐行匹配整个文本
lines.map {
case regex(name) => Some(name)
case _ => None
}
稍后使用matchCase
函数将字符串(名称)转换为数字并将名称替换为数字
lines.map { line =>
line match {
case regex(name) => line.replace("[[a-zA-z]|\\-]+", matchcase(name).toString)
case _ => line
}
}
scala> val regex = "[[0-9]|,|\\.]+([[a-zA-z]|\\-]+)".r
regex: scala.util.matching.Regex = [[0-9]|,|\.]+([[a-zA-z]|\-]+)
scala> "1,5.1,3.5,1.4,0.2,Iris-setosa" match { case regex(str) => println(s"name: $str")}
name: Iris-setosa
下一个
处理全文
scala> val text = """
| 1,5.1,3.5,1.4,0.2,Iris-setosa
| 2,4.9,3,1.4,0.2,Iris-setosa
| 3,4.7,3.2,1.3,0.2,Iris-setosa
| 51,7,3.2,4.7,1.4,Iris-versicolor
| 52,6.4,3.2,4.5,1.5,Iris-versicolor
| 53,6.9,3.1,4.9,1.5,Iris-versicolor
| 103,7.1,3,5.9,2.1,Iris-virginica
| 104,6.3,2.9,5.6,1.8,Iris-virginica
| 105,6.5,3,5.8,2.2,Iris-virginica
| """.stripMargin
text: String =
"
1,5.1,3.5,1.4,0.2,Iris-setosa
2,4.9,3,1.4,0.2,Iris-setosa
3,4.7,3.2,1.3,0.2,Iris-setosa
51,7,3.2,4.7,1.4,Iris-versicolor
52,6.4,3.2,4.5,1.5,Iris-versicolor
53,6.9,3.1,4.9,1.5,Iris-versicolor
103,7.1,3,5.9,2.1,Iris-virginica
104,6.3,2.9,5.6,1.8,Iris-virginica
105,6.5,3,5.8,2.2,Iris-virginica
"
scala> val lines = text.split("\n").filter(_.trim.nonEmpty)
lines: Array[String] = Array(1,5.1,3.5,1.4,0.2,Iris-setosa, 2,4.9,3,1.4,0.2,Iris-setosa, 3,4.7,3.2,1.3,0.2,Iris-setosa, 51,7,3.2,4.7,1.4,Iris-versicolor, 52,6.4,3.2,4.5,1.5,Iris-versicolor, 53,6.9,3.1,4.9,1.5,Iris-versicolor, 103,7.1,3,5.9,2.1,Iris-virginica, 104,6.3,2.9,5.6,1.8,Iris-virginica, 105,6.5,3,5.8,2.2,Iris-virginica)
scala> lines.map {
| case regex(name) => Some(name)
| case _ => None
| }
res18: Array[Option[String]] = Array(Some(Iris-setosa), Some(Iris-setosa), Some(Iris-setosa), Some(Iris-versicolor), Some(Iris-versicolor), Some(Iris-versicolor), Some(Iris-virginica), Some(Iris-virginica), Some(Iris-virginica))
现在使用collect
并且只收集Some
值
scala> res18.collect { case Some(value) => value }
res19: Array[String] = Array(Iris-setosa, Iris-setosa, Iris-setosa, Iris-versicolor, Iris-versicolor, Iris-versicolor, Iris-virginica, Iris-virginica, Iris-virginica)
scala> res19.mkString("\n")
res20: String =
Iris-setosa
Iris-setosa
Iris-setosa
Iris-versicolor
Iris-versicolor
Iris-versicolor
Iris-virginica
Iris-virginica
Iris-virginica
在您的评论中您提到了
实际上我想通过使用matchcase函数替换整个文件中的文本
并假设您具有问题中提到的数据和功能,则可以使用scala.io.Source.fromFile
读取文件
val data = scala.io.Source.fromFile("input file path")
调用您编写的matchcase
函数
val replacedData = data.getLines().map(_.split(",")).map(array => array.init.mkString(",")+","+matchcase(array.last))
最后写输出
new PrintWriter("path to output file"){write(replacedData.mkString("\n")); close}
您应该有一个包含以下数据的文件
1,5.1,3.5,1.4,0.2,10
2,4.9,3,1.4,0.2,10
3,4.7,3.2,1.3,0.2,10
51,7,3.2,4.7,1.4,30
52,6.4,3.2,4.5,1.5,30
53,6.9,3.1,4.9,1.5,30
103,7.1,3,5.9,2.1,20
104,6.3,2.9,5.6,1.8,20
105,6.5,3,5.8,2.2,20
我希望答案是有帮助的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.