Write a string containing commas and double quotes to CSV
In my case, I didn't want to quote strings that did not need quoting. So I test the string for nasty characters before quoting it.
function escapeCSV (term) {
if (term.match && term.match(/,|"/)) {
return `"${term.replace('"','""')}"`
} else {
return term
}
}
It turns out that, according to the CSV specs, to include double quotes within a string that is already quoted, you need to use two double quotes (""). I changed:
itemDesc = itemDesc.replace(/"/g, '\"');
to
itemDesc = itemDesc.replace(/"/g, '""');
I also removed
itemDesc = itemDesc.replace(/,/g, '\,');
itemDesc = itemDesc.replace(/'/g, '\'');
Since the column in the CSV is being quoted already. These are unnecessary.
I use this simple function to convert an string[][]
to a csv file. It quotes the cell, if it contains a "
, a ,
or other whitespace (except blanks):
/**
* Takes an array of arrays and returns a `,` sparated csv file.
* @param {string[][]} table
* @returns {string}
*/
export function toCSV(table: string[][]) {
return table
.map(row =>
row
.map(cell => {
// We remove blanks and check if the column contains
// other whitespace,`,` or `"`.
// In that case, we need to quote the column.
if (cell.replace(/ /g, '').match(/[\s,"]/)) {
return '"' + cell.replace(/"/g, '""') + '"';
}
return cell;
})
.join(',')
)
.join('\n');
}