Scala CSV Parser

之前一直用 parboiled2 的 CSVParser,非常好用,当然,不只是 CSVParser 好,而且是整个 parboiled2 弥补了 scala dsl 性能方面的缺陷,原因大家都懂的,scala 只有 regex parser

但是 parboiled2 不能支持 streaming 方式的 parse 和 process,这对于大文件,或是内存不足的情况,是比较致命的。
parboiled2 社区也有人提过这个问题,由于 PEG 解析是需要回溯的,比较难做成 streaming 的。
那就自己写一个好了,也不算复杂。
后续补充性能指标。

object CsvParser extends App {

  def parse[T](path: String, f: List[String] => T): List[T] = {
    val s = Source.fromFile(path)
    val r = s.getLines().map(l => {
      def field(chars: List[Char], record: List[String]) = chars.reverse.mkString :: record
      val (_, _, cs, r) = ((false, false, List[Char](), List[String]()) /: l) { case ((quote, backslash, chars, record), c) =>
        val dq = !backslash && c == '"'
        val q = dq ^ quote
        val bs = !backslash && c == '\\'
        val (cs, r) = if (!q && c == ',') (Nil, field(chars, record)) else (if (dq) chars else (c :: chars), record)
        (q, bs, cs, r)
      }
      val record = field(cs, r).reverse
      f(record)
    }).toList
    s.close()
    r
  }

  parse("test.csv", r => println(r.mkString))

}

Scala CSV Parser》上有2条评论

  1. Cindy

    “informa corresponder essa percentagem (cc de 90%) a mortes antes da chegada dos colonos aos territórios índios”Que alr.abonadForam mortes provocadas pelas doenças que os colonos trouxeram.E não foram 90%, foram 95%. Não sabe ler?Nunca se farta de dar barraca?

    回复

发表评论

电子邮件地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据