parse

import { parse } from "jsr:@ende/csv";

function

function parse(input: string): string[][]

Parses CSV string into an array of arrays of strings.

input: string

The input to parse.

Returns

The parsed data.

Example: Usage

import { parse } from "@ende/csv/parse";
import { assertEquals } from "@ende/assert/equals";

const string = "a,b,c\n#d,e,f";

assertEquals(parse(string), [["a", "b", "c"], ["#d", "e", "f"]]);

Example: Quoted fields

import { parse } from "@ende/csv/parse";
import { assertEquals } from "@ende/assert/equals";

const string = `"a ""word""","comma,","newline\n"\nfoo,bar,baz`;
const result = parse(string);

assertEquals(result, [
  ['a "word"', "comma,", "newline\n"],
  ["foo", "bar", "baz"]
]);

function

function parse<T extends ParseOptions>(input: string, options: T): ParseResult<ParseOptions, T>

Parses CSV string into an array of objects or an array of arrays of strings.

If columns or skipFirstRow option is provided, it returns an array of objects, otherwise it returns an array of arrays of string.

input: string

The input to parse.

options: T

The options for parsing.

Returns

If you don't provide options.skipFirstRow or options.columns, it returns string[][]. If you provide options.skipFirstRow or options.columns, it returns Record<string, string>[].

Example: Don't skip first row with skipFirstRow: false

import { parse } from "@ende/csv/parse";
import { assertEquals } from "@ende/assert/equals";
import { assertType, IsExact } from "@ende/testing/types"

const string = "a,b,c\nd,e,f";
const result = parse(string, { skipFirstRow: false });

assertEquals(result, [["a", "b", "c"], ["d", "e", "f"]]);
assertType<IsExact<typeof result, string[][]>>(true);

Example: Skip first row with skipFirstRow: true

import { parse } from "@ende/csv/parse";
import { assertEquals } from "@ende/assert/equals";
import { assertType, IsExact } from "@ende/testing/types"

const string = "a,b,c\nd,e,f";
const result = parse(string, { skipFirstRow: true });

assertEquals(result, [{ a: "d", b: "e", c: "f" }]);
assertType<IsExact<typeof result, Record<string, string>[]>>(true);

Example: Specify columns with columns option

import { parse } from "@ende/csv/parse";
import { assertEquals } from "@ende/assert/equals";
import { assertType, IsExact } from "@ende/testing/types"

const string = "a,b,c\nd,e,f";
const result = parse(string, { columns: ["x", "y", "z"] });

assertEquals(result, [{ x: "a", y: "b", z: "c" }, { x: "d", y: "e", z: "f" }]);
assertType<IsExact<typeof result, Record<"x" | "y" | "z", string>[]>>(true);

Example: Specify columns with columns option and skip first row with

skipFirstRow: true

import { parse } from "@ende/csv/parse";
import { assertEquals } from "@ende/assert/equals";
import { assertType, IsExact } from "@ende/testing/types"

const string = "a,b,c\nd,e,f";
const result = parse(string, { columns: ["x", "y", "z"], skipFirstRow: true });

assertEquals(result, [{ x: "d", y: "e", z: "f" }]);
assertType<IsExact<typeof result, Record<"x" | "y" | "z", string>[]>>(true);

Example: TSV (tab-separated values) with separator: "\t"

import { parse } from "@ende/csv/parse";
import { assertEquals } from "@ende/assert/equals";

const string = "a\tb\tc\nd\te\tf";
const result = parse(string, { separator: "\t" });

assertEquals(result, [["a", "b", "c"], ["d", "e", "f"]]);

Example: Trim leading space with trimLeadingSpace: true

import { parse } from "@ende/csv/parse";
import { assertEquals } from "@ende/assert/equals";

const string = " a,  b,    c\n";
const result = parse(string, { trimLeadingSpace: true });

assertEquals(result, [["a", "b", "c"]]);

Example: Lazy quotes with lazyQuotes: true

import { parse } from "@ende/csv/parse";
import { assertEquals } from "@ende/assert/equals";

const string = `a "word","1"2",a","b`;
const result = parse(string, { lazyQuotes: true });

assertEquals(result, [['a "word"', '1"2', 'a"', 'b']]);

Example: Set comment prefix with comment option

import { parse } from "@ende/csv/parse";
import { assertEquals } from "@ende/assert/equals";

const string = "a,b,c\n# THIS IS A COMMENT LINE\nd,e,f";
const result = parse(string, { comment: "#" });

assertEquals(result, [["a", "b", "c"], ["d", "e", "f"]]);

Example: Infer the number of fields from the first row with fieldsPerRecord: 0

import { parse } from "@ende/csv/parse";
import { assertThrows } from "@ende/assert/throws";

// Note that the second row has more fields than the first row
const string = "a,b\nc,d,e";
assertThrows(
 () => parse(string, { fieldsPerRecord: 0 }),
 SyntaxError,
 "Syntax error on line 2: expected 2 fields but got 3",
);

Example: Enforce the number of fields for each row with fieldsPerRecord: 2

import { parse } from "@ende/csv/parse";
import { assertThrows } from "@ende/assert/throws";

const string = "a,b\nc,d,e";
assertThrows(
 () => parse(string, { fieldsPerRecord: 2 }),
 SyntaxError,
 "Syntax error on line 2: expected 2 fields but got 3",
);

function

function parse<T extends ParseOptions>(input: string, options: T = [UNSUPPORTED]): ParseResult<ParseOptions, T>

Source