CSV Field Escaping for Safe Export

Escape CSV fields containing delimiters, quotes, line breaks or edge whitespace, doubling quotes and leaving simple values alone.

TypescriptData Integrity

Code

snippet
export function escapeCsvField(value: unknown, delimiter = ","): string {
  if (typeof delimiter !== "string" || delimiter.length !== 1) {
    throw new RangeError("delimiter must be a single character");
  }
  if (value === null || value === undefined) return "";
  const text = String(value);
  const needsQuotes =
    text.includes(delimiter) ||
    text.includes('"') ||
    /[\r\n]/.test(text) ||
    /^\s|\s$/.test(text);
  if (!needsQuotes) return text;
  return '"' + text.replace(/"/g, '""') + '"';
}

export function toCsvRow(values: readonly unknown[], delimiter = ","): string {
  return values.map((value) => escapeCsvField(value, delimiter)).join(delimiter);
}