Kein Formelschutz in einer Datei, die eine Maschine einliest
Das vorangestellte Hochkomma schuetzt einen Menschen, der eine CSV in Excel oeffnet: ein Wert mit fuehrendem =, +, - oder @ waere dort sonst eine Formel. In einer Load-Datei ist es das Gegenteil von Schutz. Jede oesterreichische Telefonnummer beginnt mit "+", und in LOLYO stuende danach in jedem Konto '+4366... als Nummer -- ohne dass es beim Erzeugen jemandem auffiele. toCsv bekommt dafuer formelschutz in der CsvForm, voreingestellt an. Nur LOLYO schaltet es ab. Die Telefonspalten von Cornerstone sind bisher leer, deshalb bleibt die Datei dort, wie sie ist.
This commit is contained in:
@@ -23,9 +23,10 @@ export function sanitizeForSpreadsheetCell(text: string): string {
|
||||
return /^[=+\-@]/.test(text) ? `'${text}` : text;
|
||||
}
|
||||
|
||||
function csvCell(value: string | number | boolean | null, trenner: string): string {
|
||||
function csvCell(value: string | number | boolean | null, trenner: string, formelschutz: boolean): string {
|
||||
if (value === null || value === undefined) return "";
|
||||
const text = typeof value === "boolean" ? (value ? "Ja" : "Nein") : sanitizeForSpreadsheetCell(String(value));
|
||||
const roh = typeof value === "boolean" ? (value ? "Ja" : "Nein") : String(value);
|
||||
const text = formelschutz ? sanitizeForSpreadsheetCell(roh) : roh;
|
||||
// Das Trennzeichen gehört in die Prüfung: mit Komma als Trenner muss ein
|
||||
// Komma im Wert maskiert werden, sonst zerfällt die Zeile in zwei Spalten.
|
||||
return text.includes(trenner) || /["\n\r]/.test(text) ? `"${text.replace(/"/g, '""')}"` : text;
|
||||
@@ -39,15 +40,22 @@ function csvCell(value: string | number | boolean | null, trenner: string): stri
|
||||
* ankommen. Ein fremdes System will oft das Gegenteil — Cornerstone etwa
|
||||
* erwartet Kommas, und ein BOM machte dort aus der ersten Spalte eine, die in
|
||||
* keiner Zuordnung vorkommt, weil das unsichtbare Zeichen im Namen steckt.
|
||||
*
|
||||
* `formelschutz: false` schaltet das vorangestellte Hochkomma ab (siehe
|
||||
* sanitizeForSpreadsheetCell). Es gehört in eine Datei, die ein Mensch in Excel
|
||||
* öffnet, und es verdirbt eine, die eine Maschine einliest: eine österreichische
|
||||
* Telefonnummer beginnt mit „+", und im Zielsystem stünde danach `'+43…` als
|
||||
* Nummer. Nur für Dateien setzen, die ausschliesslich ein Fremdsystem liest.
|
||||
*/
|
||||
export type CsvForm = { trenner?: "," | ";"; bom?: boolean };
|
||||
export type CsvForm = { trenner?: "," | ";"; bom?: boolean; formelschutz?: boolean };
|
||||
|
||||
export function toCsv<T>(rows: T[], columns: ExportColumn<T>[], form: CsvForm = {}): string {
|
||||
const trenner = form.trenner ?? ";";
|
||||
const bom = form.bom ?? true;
|
||||
const lines = [columns.map((c) => csvCell(c.header, trenner)).join(trenner)];
|
||||
const schutz = form.formelschutz ?? true;
|
||||
const lines = [columns.map((c) => csvCell(c.header, trenner, schutz)).join(trenner)];
|
||||
for (const row of rows) {
|
||||
lines.push(columns.map((c) => csvCell(c.get(row), trenner)).join(trenner));
|
||||
lines.push(columns.map((c) => csvCell(c.get(row), trenner, schutz)).join(trenner));
|
||||
}
|
||||
return (bom ? "" : "") + lines.join("\r\n");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user