なんじゃくにっき

プログラミングの話題中心。

ScalaでCSVファイルをパース

ScalaCSVファイルをパースしたいと思います。
CSVファイルっつっても形式がいっぱいあるんですが、ここでは
「区切り文字はカンマで各項目はダブルクオートで囲まれているのと囲まれていないのが混ざっている」
とします。
例)1,2,3,"4",5,"6,6",7
 
ダブルクオートで囲まれていなければ、
"""1,2,3,4,5,6,7""".split(',')
みたいな感じで簡単にできますが、
ダブルクオートで囲まれた文字列の中にカンマが入っていると正しくパースできません。
 
ParserCombinator使ってパースしてたりする人もいますが、
http://stackoverflow.com/questions/5063022/use-scala-parser-combinator-to-parse-csv-files
 
簡単に自分で書いてみようかと。 


object CSVParser {
//CSVファイルの1行をパースしてListにして返す
def parseLine(inStr: String): List[String] = {
val inQuote = """"(.*?)",(.*)""".r
val notInQuote = """(.*?),(.*)""".r

inStr match {
case inQuote(a, b) => {a :: parseLine(b)}
case notInQuote(a, b) => {a :: parseLine(b)}
case _ => List(inStr)
}
}
}

object Main extends App {
val list1 = CSVParser.parseLine("""1,2,3,"4",5,"6,6",7""")
assert(list1 == List("1", "2", "3", "4", "5", "6,6", "7"))
}

正規表現でパターンマッチかけてるだけです(´・ω・`)
 
追記:ちょっとバグ発見。あとで直します