在Scala中,如何通过一对键值在CSV中查找元素?

在Scala中,如何通过一对键值在CSV中查找元素?,scala,file-io,csv,Scala,File Io,Csv,例如,从以下文件: Name,Surname,E-mail John,Smith,john.smith@hotmail.com Nancy,Smith,nancy.smith@gmail.com Jane,Doe,jane.doe@aol.com John,Doe,john.doe@yahoo.com 我曾尝试编写“iter.find(u0)=“John”&&&&&(1)=“Doe”)”,但这会导致一个错误,即只需要一个参数(将条件括在额外的一对括号中没有帮助)。下划线作为lambda参数的占位

例如,从以下文件:

Name,Surname,E-mail John,Smith,john.smith@hotmail.com Nancy,Smith,nancy.smith@gmail.com Jane,Doe,jane.doe@aol.com John,Doe,john.doe@yahoo.com
我曾尝试编写“iter.find(u0)=“John”&&&&&(1)=“Doe”)”,但这会导致一个错误,即只需要一个参数(将条件括在额外的一对括号中没有帮助)。

下划线作为lambda参数的占位符,其工作方式与您想象的不一样

a => println(a)
// is equivalent to
println(_)

(a,b) => a + b
// is equivalent to 
_ + _

a => a + a
// is not equivalent to
_ + _
也就是说,第一个下划线表示第一个参数,第二个下划线表示第二个参数,依此类推。这就是您看到的错误的原因——您使用了两个下划线,但只有一个参数。修复方法是使用显式版本:

iter.find( a=> a(0) == "John" && a(1) == "Doe" )
您可以使用正则表达式:

scala> def getRegex(v1: String, v2: String) = (v1 + "," + v2 +",(\\S+)").r
getRegex: (v1: String,v2: String)scala.util.matching.Regex

scala> val src = """John,Smith,john.smith@hotmail.com
     | Nancy,Smith,nancy.smith@gmail.com
     | Jane,Doe,jane.doe@aol.com
     | John,Doe,john.doe@yahoo.com
     | """
src: java.lang.String =
John,Smith,john.smith@hotmail.com
Nancy,Smith,nancy.smith@gmail.com
Jane,Doe,jane.doe@aol.com
John,Doe,john.doe@yahoo.com


scala> val MAIL = getRegex("John","Doe")
MAIL: scala.util.matching.Regex = John,Doe,(\S+)

scala> val itr = src.lines
itr: Iterator[String] = non-empty iterator

scala> for(MAIL(address) <- itr) println(address)
john.doe@yahoo.com

scala>
scala>def getRegex(v1:String,v2:String)=(v1+”,“+v2+”,(\\S+).r
getRegex:(v1:String,v2:String)scala.util.matching.Regex
scala>val src=“”约翰,史密斯,约翰。smith@hotmail.com
|南希,史密斯,南希。smith@gmail.com
|简,多伊,简。doe@aol.com
|约翰,多伊,约翰。doe@yahoo.com
| """
src:java.lang.String=
约翰,史密斯,约翰。smith@hotmail.com
南希,史密斯,南希。smith@gmail.com
简,多伊,简。doe@aol.com
约翰,多伊,约翰。doe@yahoo.com
scala>val MAIL=getRegex(“John”、“Doe”)
邮件:scala.util.matching.Regex=John,Doe,(\S+)
scala>val itr=src.lines
itr:迭代器[字符串]=非空迭代器
scala>for(邮件(地址)

您还可以在
中对
拆分的结果进行模式匹配,以进行理解

val firstName = "John"
val surName = "Doe"
val emails = for {
  Array(`firstName`, `surName`, email) <- 
    src.getLines().drop(1) map { _ split ',' }
} yield { email }

println(emails.mkString(","))
val firstName=“约翰”
val姓氏=“Doe”
val电子邮件=用于{

数组(`firstName`、`names`、email),您也可以使用MAIL.findAllIn(src)。如果这确实是一个CSV文件,那么使用StringOps.split(“,”)是错误的,并且不能处理逗号(,)和/或双引号(“)是嵌入值一部分的情况。我只是在这里的StackOverflow回答中解决了这个问题:使用StringOps.split(“,”)是错误的,不处理逗号(,)和/或双引号(“)是嵌入值的一部分的情况。我只是在我的StackOverflow回答中解决了这个问题:StackOverflow.com/a/32488453/501113
val firstName = "John"
val surName = "Doe"
val emails = for {
  Array(`firstName`, `surName`, email) <- 
    src.getLines().drop(1) map { _ split ',' }
} yield { email }

println(emails.mkString(","))