2010-09-03 4 views
5

:Scala'da, CSV'deki bir elemein bir çift anahtar değerle nasıl bulunur? Bir aşağıdaki dosyadan Örneğin

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

nasıl John Doe e-posta adresini alırım?

Şimdi şu kodu kullanın, ama şimdi sadece bir anahtar alanını belirtebilirsiniz: Ben yazmaya denedim

 

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) == "John" & & _ (1) == "Doe") ", ancak bu yalnızca bir parametrenin beklendiğini söyleyen bir hata ortaya çıkarır (koşulu ekstra parantez içine almak yardımcı olmaz).

+0

Bu gerçekten bir CSV dosyasıysa, StringOps.split (",") öğesi yanlıştır ve virgül (,) ve/veya çift tırnak (") 'ın parçası olduğu durumlarla ilgilenmez. . gömülü değer ben burda ki StackOverflow cevaplarken ele. http://stackoverflow.com/a/32488453/501113 – chaotic3quilibrium

cevap

5

düşündüğünüz şekilde çalışmıyor bir lambda bir parametre için bir yer tutucu olarak alt çizgi. olduğu

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

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

a => a + a 
// is not equivalent to 
_ + _ 

birinci çizgi birinci parametresini, ve ikinci bir çok ikinci parametre ve anlamına gelir. Yani, gördüğünüz hatanın nedeni budur - iki altçizgi kullanıyorsunuz ancak sadece bir parametreniz var. Normal İfadeler kullanabilirsiniz

iter.find(a=> a(0) == "John" && a(1) == "Doe") 
1

: Ayrıca for anlama split sonucuna bir desen maçı yapabileceği

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] 
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

Ve ayrıca MAIL.findAllIn (src) – Eastsun

0

düzeltme açık versiyonunu kullanmaktır.

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

println(emails.mkString(",")) 

Not desende backticks: Bu yeni bir değişken eşleştirme şey tanıtan ve val firstname gölgeleme yerine firstName değerine maç anlamına gelir.

+0

StringOps.split ("") kullanma kullanabileceği başka hatalı ve virgül (,) ve/veya çift tırnak (") gömülü bir değerin parçası olduğu durumlar ile uğraşmaz. Bunu sadece StackOverflow cevabımda şöyle yanıtladı: stackoverflow.com/a/32488453/501113 – chaotic3quilibrium

İlgili konular