src/Pure/General/csv.scala
author wenzelm
Sat, 01 Jun 2019 11:29:59 +0200
changeset 70299 83774d669b51
parent 67737 8af6fcdc869d
child 71601 97ccf48c2f0c
permissions -rw-r--r--
Added tag Isabelle2019-RC4 for changeset ad2d84c42380

/*  Title:      Pure/General/csv.scala
    Author:     Makarius

Support for CSV: RFC 4180.
*/

package isabelle


object CSV
{
  def print_field(field: Any): String =
  {
    val str = field.toString
    if (str.exists("\",\r\n".contains(_))) {
      (for (c <- str) yield { if (c == '"') "\"\"" else c.toString }).mkString("\"", "", "\"")
    }
    else str
  }

  sealed case class Record(fields: Any*)
  {
    override def toString: String = fields.iterator.map(print_field(_)).mkString(",")
  }

  sealed case class File(name: String, header: List[String], records: List[Record])
  {
    override def toString: String = (Record(header:_*) :: records).mkString("\r\n")

    def file_name: String = name + ".csv"
    def write(dir: Path) { isabelle.File.write(dir + Path.explode(file_name), toString) }
  }
}