CSV: escape quotes in toCSV (#16874)

This commit is contained in:
psschand 2019-05-03 21:31:13 +05:00 committed by Ryan McKinley
parent c3a5204933
commit 2af69ccf0f
3 changed files with 5 additions and 2 deletions

View File

@ -48,11 +48,13 @@ function norm(csv: string): string {
describe('write csv', () => {
it('should write the same CSV that we read', () => {
const firstRow = [10, 'this "has quotes" inside', true];
const path = __dirname + '/testdata/roundtrip.csv';
const csv = fs.readFileSync(path, 'utf8');
const data = readCSV(csv);
const out = toCSV(data, { headerStyle: CSVHeaderStyle.full });
expect(data.length).toBe(1);
expect(data[0].rows[0]).toEqual(firstRow);
expect(data[0].fields.length).toBe(3);
expect(norm(out)).toBe(norm(csv));
@ -63,6 +65,7 @@ describe('write csv', () => {
const f = readCSV(shorter);
const fields = f[0].fields;
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
});
});

View File

@ -266,7 +266,7 @@ function writeValue(value: any, config: CSVConfig): string {
const str = value.toString();
if (str.includes('"')) {
// 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)) {
return config.quoteChar + str + config.quoteChar;

View File

@ -1,7 +1,7 @@
#name#a,b,c
#type#number,string,boolean
#unit#ms,,s
10,AA,true
10,"this ""has quotes"" inside",true
20,XX,false
30,YY,false
40,ZZ,true

1 #name#a b c
2 #type#number string boolean
3 #unit#ms s
4 10 AA this "has quotes" inside true
5 20 XX false
6 30 YY false
7 40 ZZ true