2016-12-03 7 views
-1

を分割:Scalaはパース/次のように表された文字列があり、文字列

val str = "teacher.name:ABC DEF student.age:20 teacher.gender:male teacher.tag:123 student.name:XYZ" 

私は教師と生徒でグループ化するので、結果は次のようになります。

val teacher = "name:ABC DEF gender:male tag:123" 

val student = "age:20 name:XYZ" 

この例では、 、どちらか "先生"。または "学生"意味のあるデリミタです。 "。"がないと仮定します。他の場所で。

Scalaを使用してコードを書くとどうやってうまくできますか?かもしれない

+0

ここで意味のあるデリミタは何ですか?もしあなたが "Howard Studently"や "Janet Suteacher"のような名前を持っていたら?各レコードの開始/終了を識別するためのマーカーは何ですか? – jwvh

+0

この例では、 "teacher"です。または "学生"意味のあるデリミタです。 "。"がないと仮定します。他の場所で。良い質問。 – ttt

答えて

2

これが行う可能性がありますそれ。

val str = "teacher.name:ABC DEF student.age:20 teacher.gender:male teacher.tag:123 student.name:XYZ" 

val teacher = str.split("teacher.").map(_.split("student.").head.trim).tail.mkString(", ") 
// teacher: String = name:ABC DEF, gender:male, tag:123 

val student = str.split("student.").map(_.split("teacher.").head.trim).tail.mkString(", ") 
// student: String = age:20, name:XYZ 

冗長側のビットが、ストレートフォワードアルゴリズム

:あなたがいないラベルにしたいラベル、サブ分割に分割。

+0

名前に ' - 'が含まれているように見えますが、動作しません。 – ttt

+0

なぜあなたはそれを言うのか分かりません。あなたはそれを試してみましたか?私のテストによれば、名前に「 - 」をつけたり、どこかで、何かを壊すことはありません。 – jwvh

1

「素敵」は相対的であり、それは、文字列を歩いておそらく最善ですが、強引な答えは、Scalaの収集方法に寄りかかっ:

// tokenize the input 
val tokens = str.reverse.split(':').flatMap(_.split(" ", 2)).map(_.reverse).reverse 

// zip tokens into key-value pairs 
val pairs = (tokens zip tokens.drop(1)).zipWithIndex.filter(_._2 % 2 == 0).map(_._1) 

// group key-value pairs and join string 
pairs.groupBy(_._1.split('.').head).mapValues(_.collect({ case (a, b) => a.split('.').last + ":" + b }).mkString(" ")) 

// Map(student -> age:20 name:XYZ, teacher -> name:ABC DEF gender:male tag:123) 

`` `

関連する問題