Skip to content

Instantly share code, notes, and snippets.

@amatiasq
Created March 2, 2020 12:45
Show Gist options
  • Save amatiasq/f36f06b18bc259045634e95699e1aabd to your computer and use it in GitHub Desktop.
Save amatiasq/f36f06b18bc259045634e95699e1aabd to your computer and use it in GitHub Desktop.
const QUOTE = '"';
const SEPARATOR = ',';
const ROW_SEPARATOR = '\n';
export function parseCsv(content: string) {
const len = content.length;
const data = [];
let row = [];
let isEscaped = false;
let value = '';
let i = 0;
while (i < len) {
const char = content[i];
const next = content[i + 1];
if (char === '\r') {
// windows shit...
} else if (!isEscaped && char === SEPARATOR) {
endValue();
} else if (!isEscaped && char === ROW_SEPARATOR) {
endRow();
} else if (!isEscaped && !value && char === QUOTE) {
isEscaped = true;
} else if (isEscaped && char === QUOTE) {
if (next === QUOTE) {
value += QUOTE;
i++;
} else {
isEscaped = false;
}
} else {
value += char;
}
i++;
}
if (value.length) {
endValue();
}
if (row.length) {
endRow();
}
return data;
function endRow() {
endValue();
data.push(row);
row = [];
}
function endValue() {
row.push(value);
value = '';
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment