2016-09-23 7 views
3

Scalaでは、(長さ= 20の)各メッセージを個々の単位に解析したいと思います。メッセージは改行文字なしで前のメッセージの末尾に追加されます。私は以下しようとしたが、いずれかの最適化とパフォーマンスの向上はあなたが正規表現で非常にうまくこれを行うことができますscala ..さまざまなフィールドにメッセージを解析する

/* Length.. id=3,name=5,city=8,port=3,indicator=1 */ 

def layout(rec:String) = { 
val id=rec.take(3) 
val name=rec.drop(3).take(5) 
val city=rec.drop(3+5).take(8) 
val port=rec.drop(3+5+8).take(3) 
val ind=rec.drop(3+5+8+3).take(1) 
println(id,name,city,port,ind) 
} 

val messages="101Jim Portland990Y102JamesHouston 990X103John Boston 880Y" 
messages grouped(20) foreach { x => layout(x) } 


In REPL, 

scala> :load work.scala 
Loading work.scala... 
layout: (rec: String)Unit 
messages: String = 101Jim Portland990Y102JamesHouston 990X103John Boston 880Y 
(101,Jim ,Portland,990,Y) 
(102,James,Houston ,990,X) 
(103,John ,Boston ,880,Y) 

scala> 

答えて

5

歓迎されています:

val messages = "101Jim Portland990Y102JamesHouston 990X103John Boston 880Y" 

val RecordPattern = """(\d{3})(.{5})(.{8})(\d{3})(.)""".r 

val records = messages.grouped(20).map { 
    case RecordPattern(id, name, city, port, ind) => (id, name, city, port, ind) 
} 

そして:

scala> records.foreach(println) 
(101,Jim ,Portland,990,Y) 
(102,James,Houston ,990,X) 
(103,John ,Boston ,880,Y) 

ですdroptakeのようなコレクション操作を使用して文字列を分割するよりも優れたパフォーマンスを発揮する可能性がありますが、その差は小さく、ナイトは明快です。

+0

.. @ Travis ..解決に感謝します。メッセージがebcdic形式、すなわちMainframeシステムから来ていると仮定します。どのように私はebcdicでそれを読んで、asciiに変換するのですか? – stack0114106

+0

@ stack0114106それは本当に別の質問であるべきです。 :) –

関連する問題