nested_json_to_csv
Version:
77 lines (75 loc) • 2.13 kB
text/typescript
export class Csv {
#headers: string[];
#body: string;
#rows: string[][] = [[]];
constructor(headers: string[], body?: string) {
if (headers != undefined && headers.length == 0) {
throw Error("Can't have no headers in csv");
}
this.#headers = headers ?? [];
this.#body = body ?? "";
}
getRows(): string[][] {
return this.#rows;
}
getHeaders(): string[] {
return this.#headers;
}
setbody(body: string) {
this.#body = body;
return this;
}
getBody() {
return this.#body;
}
setHeaders(headers: string[]): Csv {
this.#headers = headers;
return this;
}
makeHeaders(rawCsv: string): Csv {
let headers: string[] = [];
let line: string = rawCsv.substring(0, rawCsv.indexOf("\n"));
line = this.#lint(line);
headers = line.split(",");
this.#headers = headers;
return this;
}
makeRows(): Csv {
if (this.#body.length == 0) {
throw Error("Can't make an array of an empty body");
}
const lines: string[] = this.#body.split("\n");
if (lines[lines.length - 1] == "") lines.pop();
this.#rows = [];
lines.forEach((line) => {
line = this.#lint(line);
const row: string[] = line.split(",");
this.#rows.push(row);
});
return this;
}
#lint(line: string): string {
line = line[line.length - 1] == "," ? line.slice(0, line.length - 1) : line;
line =
line[line.length - 1] == "\r" ? line.slice(0, line.length - 1) : line;
line = line[line.length - 1] == "," ? line.slice(0, line.length - 1) : line;
let replace = false;
for (let i = 0; i < line.length; i++) {
if (line[i] == '"') replace = !replace;
if (replace) {
if (line[i] == ",") line = this.#replaceAt(line, i, "-");
}
}
line =
line[line.length - 1] == "\r" ? line.slice(0, line.length - 1) : line;
return line;
}
#replaceAt(word: string, index: number, char: string) {
const arrayChar: string[] = word.split("");
arrayChar[index] = char;
return arrayChar.join("");
}
make() {
return this.#headers.join() + "\n" + this.#body;
}
}