2010-09-03 18 views
5

例如,從以下文件:在Scala中,如何通過一對關鍵值在CSV中找到elemein?

 
Name,Surname,E-mail 
John,Smith,[email protected] 
Nancy,Smith,[email protected] 
Jane,Doe,[email protected] 
John,Doe,[email protected] 

我怎麼李四的E-mail地址?

我現在用下面的代碼,但只能指定一個現在關鍵領域:

 

val src = Source.fromFile(file) 
val iter = src.getLines().drop(1).map(_.split(",")) 
var quote = "" 
iter.find(_(1) == "Doe" ) foreach (a => println(a(2))) 
src.close() 
 

我試着寫「iter.find(_(0)== 「約翰」 & & _( 1)==「Doe」)「,但是這會產生一個錯誤,說只有一個參數是預期的(將條件包含在額外的一對括號中並沒有幫助)。

+0

如果這實際上是一個CSV文件,則使用StringOps.split(「,」)是錯誤的,並且不處理逗號(,)和/或雙引號(「)是嵌入式值。我剛纔在我的StackOverflow答案中解決了這個問題:http://stackoverflow.com/a/32488453/501113 – chaotic3quilibrium 2015-09-09 20:39:26

回答

5

下劃線作爲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") 
1

您可以使用正則表達式:

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,[email protected] 
    | Nancy,Smith,[email protected] 
    | Jane,Doe,[email protected] 
    | John,Doe,[email protected] 
    | """ 
src: java.lang.String = 
John,Smith,[email protected] 
Nancy,Smith,[email protected] 
Jane,Doe,[email protected]om 
John,Doe,[email protected] 


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) 
[email protected] 

scala> 
+1

而且你也可以使用MAIL.findAllIn(src)。 – Eastsun 2010-09-03 03:14:02

0

你也可以做的split結果的模式匹配的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(",")) 

注意該圖案中的反引號:這意味着我們匹配的firstName的值,而不是引入新的變量匹配任何東西,在遮蔽的val firstname

+0

使用StringOps.split(「,」)是錯誤並且不處理逗號(,)和/或雙引號(「)是嵌入式值的一部分的情況。我剛剛在我的StackOverflow答案中解決了這個問題:stackoverflow.com/a/32488453/501113 – chaotic3quilibrium 2015-09-09 20:40:39

相關問題