月度归档:2014年11月

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

}

中国法治现状

三大基本法,领导的看法、领导的想法、领导的说法;三个诉讼规则,大案讲政治,中案讲影响,小案讲法律;三个法律效力原则:宪法做给外国人看,法律服从内部规定,内部规定服从领导指示;法治基本状况:严格立法,普遍违法,选择执法。