src/Pure/General/csv.scala
author nipkow
Tue, 17 Jun 2025 14:11:40 +0200
changeset 82733 8b537e1af2ec
parent 75606 0f7cb6cd08fe
permissions -rw-r--r--
reinstated intersection of lists as inter_list_set
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
67737
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/General/csv.scala
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
     3
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
     4
Support for CSV: RFC 4180.
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
     5
*/
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
     6
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
     7
package isabelle
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
     8
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
     9
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    10
object CSV {
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    11
  def print_field(field: Any): String = {
67737
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
    12
    val str = field.toString
75606
0f7cb6cd08fe more robust CSV syntax, e.g. for "pull_date";
wenzelm
parents: 75393
diff changeset
    13
    if (str.exists("\",\r\n ".contains(_))) {
67737
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
    14
      (for (c <- str) yield { if (c == '"') "\"\"" else c.toString }).mkString("\"", "", "\"")
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
    15
    }
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
    16
    else str
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
    17
  }
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
    18
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    19
  sealed case class Record(fields: Any*) {
71601
97ccf48c2f0c misc tuning based on hints by IntelliJ IDEA;
wenzelm
parents: 67737
diff changeset
    20
    override def toString: String = fields.iterator.map(print_field).mkString(",")
67737
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
    21
  }
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
    22
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    23
  sealed case class File(name: String, header: List[String], records: List[Record]) {
67737
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
    24
    override def toString: String = (Record(header:_*) :: records).mkString("\r\n")
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
    25
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
    26
    def file_name: String = name + ".csv"
73340
0ffcad1f6130 tuned --- fewer warnings;
wenzelm
parents: 71601
diff changeset
    27
    def write(dir: Path): Unit = isabelle.File.write(dir + Path.explode(file_name), toString)
67737
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
    28
  }
8af6fcdc869d support for CSV files;
wenzelm
parents:
diff changeset
    29
}