1/*  Title:      Pure/General/csv.scala
2    Author:     Makarius
3
4Support for CSV: RFC 4180.
5*/
6
7package isabelle
8
9
10object CSV
11{
12  def print_field(field: Any): String =
13  {
14    val str = field.toString
15    if (str.exists("\",\r\n".contains(_))) {
16      (for (c <- str) yield { if (c == '"') "\"\"" else c.toString }).mkString("\"", "", "\"")
17    }
18    else str
19  }
20
21  sealed case class Record(fields: Any*)
22  {
23    override def toString: String = fields.iterator.map(print_field(_)).mkString(",")
24  }
25
26  sealed case class File(name: String, header: List[String], records: List[Record])
27  {
28    override def toString: String = (Record(header:_*) :: records).mkString("\r\n")
29
30    def file_name: String = name + ".csv"
31    def write(dir: Path) { isabelle.File.write(dir + Path.explode(file_name), toString) }
32  }
33}
34