Commit 2af69ccf by psschand Committed by Ryan McKinley

CSV: escape quotes in toCSV (#16874)

parent c3a52049
...@@ -48,11 +48,13 @@ function norm(csv: string): string { ...@@ -48,11 +48,13 @@ function norm(csv: string): string {
describe('write csv', () => { describe('write csv', () => {
it('should write the same CSV that we read', () => { it('should write the same CSV that we read', () => {
const firstRow = [10, 'this "has quotes" inside', true];
const path = __dirname + '/testdata/roundtrip.csv'; const path = __dirname + '/testdata/roundtrip.csv';
const csv = fs.readFileSync(path, 'utf8'); const csv = fs.readFileSync(path, 'utf8');
const data = readCSV(csv); const data = readCSV(csv);
const out = toCSV(data, { headerStyle: CSVHeaderStyle.full }); const out = toCSV(data, { headerStyle: CSVHeaderStyle.full });
expect(data.length).toBe(1); expect(data.length).toBe(1);
expect(data[0].rows[0]).toEqual(firstRow);
expect(data[0].fields.length).toBe(3); expect(data[0].fields.length).toBe(3);
expect(norm(out)).toBe(norm(csv)); expect(norm(out)).toBe(norm(csv));
...@@ -63,6 +65,7 @@ describe('write csv', () => { ...@@ -63,6 +65,7 @@ describe('write csv', () => {
const f = readCSV(shorter); const f = readCSV(shorter);
const fields = f[0].fields; const fields = f[0].fields;
expect(fields.length).toBe(3); expect(fields.length).toBe(3);
expect(f[0].rows[0]).toEqual(firstRow);
expect(fields.map(f => f.name).join(',')).toEqual('a,b,c'); // the names expect(fields.map(f => f.name).join(',')).toEqual('a,b,c'); // the names
}); });
}); });
...@@ -266,7 +266,7 @@ function writeValue(value: any, config: CSVConfig): string { ...@@ -266,7 +266,7 @@ function writeValue(value: any, config: CSVConfig): string {
const str = value.toString(); const str = value.toString();
if (str.includes('"')) { if (str.includes('"')) {
// Escape the double quote characters // Escape the double quote characters
return config.quoteChar + str.replace('"', '""') + config.quoteChar; return config.quoteChar + str.replace(/"/gi, '""') + config.quoteChar;
} }
if (str.includes('\n') || str.includes(config.delimiter)) { if (str.includes('\n') || str.includes(config.delimiter)) {
return config.quoteChar + str + config.quoteChar; return config.quoteChar + str + config.quoteChar;
......
#name#a,b,c #name#a,b,c
#type#number,string,boolean #type#number,string,boolean
#unit#ms,,s #unit#ms,,s
10,AA,true 10,"this ""has quotes"" inside",true
20,XX,false 20,XX,false
30,YY,false 30,YY,false
40,ZZ,true 40,ZZ,true
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment