Problems › TypeScript › text
Split one CSV line properly
An import job reads a CSV where some fields legitimately contain commas, so splitting on the comma alone corrupts the data.
- Commas separate fields, except inside a double-quoted field.
- Inside a quoted field, two double quotes in a row mean one literal quote.
- The quotes themselves are not part of the value.
- An empty line gives an empty list; an empty field between two commas gives an empty string.
parseCsvLine(line: string) → list<string>
Where you start
function parseCsvLine(line: string): string[] {
}
Worked examples
| Call | Result |
|---|---|
parseCsvLine("a,b,c") | ["a","b","c"] |
parseCsvLine("a,\"b,c\",d") | ["a","b,c","d"] |
parseCsvLine("\"say \"\"hi\"\"\",x") | ["say \"hi\"","x"] |
parseCsvLine("a,,b") | ["a","","b"] |
Hint
Walk the line one character at a time carrying a single boolean: are we inside quotes right now.
Reference solution in TypeScript
function parseCsvLine(line: string): string[] {
if (line === '') return [];
const fields: string[] = [];
let cur = '';
let quoted = false;
let i = 0;
while (i < line.length) {
const c = line[i];
if (quoted) {
if (c === '"') {
if (line[i + 1] === '"') {
cur += '"';
i += 2;
continue;
}
quoted = false;
i++;
continue;
}
cur += c;
i++;
} else if (c === '"') {
quoted = true;
i++;
} else if (c === ',') {
fields.push(cur);
cur = '';
i++;
} else {
cur += c;
i++;
}
}
fields.push(cur);
return fields;
}