web-csv-toolbox
    Preparing search index...

    web-csv-toolbox

    npm version License: MIT PRs Welcome node version FOSSA Status

    npm package minimized gzipped size GitHub code size in bytes npm codecov

    ๐ŸŒ web-csv-toolbox ๐Ÿงฐ

    A CSV Toolbox utilizing Web Standard APIs.

    ๐Ÿ”—

    GitHub npm API Reference Ask DeepWiki Sponsor CodSpeed Badge

    format: Biome test: Vitest build: Vite


    • ๐ŸŒ Web Standards first.
    • โค๏ธ TypeScript friendly & User friendly.
      • Fully typed and documented.
    • 0๏ธโƒฃ Zero dependencies.
      • Using only Web Standards APIs.
    • ๐Ÿ’ช Property-based testing.
    • โœ… Cross-platform.
      • Works on browsers, Node.js, and Deno.
    • ๐ŸŒŠ Efficient CSV Parsing with Streams
      • ๐Ÿ’ป Leveraging the WHATWG Streams API and other Web APIs for seamless and efficient data processing.
    • ๐Ÿ›‘ AbortSignal and Timeout Support: Ensure your CSV processing is cancellable, including support for automatic timeouts.
      • โœ‹ Integrate with AbortController to manually cancel operations as needed.
      • โณ Use AbortSignal.timeout to automatically cancel operations that exceed a specified time limit.
    • ๐ŸŽจ Flexible Source Support
      • ๐Ÿงฉ Parse CSVs directly from strings, ReadableStreams, or Response objects.
    • โš™๏ธ Advanced Parsing Options: Customize your experience with various delimiters and quotation marks.
      • ๐Ÿ”„ Defaults to , and " respectively.
    • ๐Ÿ’พ Specialized Binary CSV Parsing: Leverage Stream-based processing for versatility and strength.
      • ๐Ÿ”„ Flexible BOM handling.
      • ๐Ÿ—œ๏ธ Supports various compression formats.
      • ๐Ÿ”ค Charset specification for diverse encoding.
    • ๐Ÿš€ Using WebAssembly for High Performance: WebAssembly is used for high performance parsing. (Experimental)
      • ๐Ÿ“ฆ WebAssembly is used for high performance parsing.
    • ๐Ÿ“ฆ Lightweight and Zero Dependencies: No external dependencies, only Web Standards APIs.
    • ๐Ÿ“š Fully Typed and Documented: Fully typed and documented with TypeDoc.

    This package can then be installed using a package manager.

    # Install with npm
    $ npm install web-csv-toolbox
    # Or Yarn
    $ yarn add web-csv-toolbox
    # Or pnpm
    $ pnpm add web-csv-toolbox
    <script src="https://unpkg.com/web-csv-toolbox"></script>
    <script>
    const csv = `name,age
    Alice,42
    Bob,69`;

    (async function () {
    for await (const record of CSV.parse(csv)) {
    console.log(record);
    }
    })();
    </script>
    <script type="module">
    import { parse } from 'https://unpkg.com/web-csv-toolbox?module';

    const csv = `name,age
    Alice,42
    Bob,69`;

    for await (const record of parse(csv)) {
    console.log(record);
    }
    </script>

    You can install and use the package by specifying the following:

    import { parse } from "npm:web-csv-toolbox";
    
    import { parse } from 'web-csv-toolbox';

    const csv = `name,age
    Alice,42
    Bob,69`;

    for await (const record of parse(csv)) {
    console.log(record);
    }
    // Prints:
    // { name: 'Alice', age: '42' }
    // { name: 'Bob', age: '69' }
    import { parse } from 'web-csv-toolbox';

    const csv = `name,age
    Alice,42
    Bob,69`;

    const stream = new ReadableStream({
    start(controller) {
    controller.enqueue(csv);
    controller.close();
    },
    });

    for await (const record of parse(stream)) {
    console.log(record);
    }
    // Prints:
    // { name: 'Alice', age: '42' }
    // { name: 'Bob', age: '69' }
    import { parse } from 'web-csv-toolbox';

    const response = await fetch('https://example.com/data.csv');

    for await (const record of parse(response)) {
    console.log(record);
    }
    // Prints:
    // { name: 'Alice', age: '42' }
    // { name: 'Bob', age: '69' }
    import { parse } from 'web-csv-toolbox';

    const csv = `name\tage
    Alice\t42
    Bob\t69`;

    for await (const record of parse(csv, { delimiter: '\t' })) {
    console.log(record);
    }
    // Prints:
    // { name: 'Alice', age: '42' }
    // { name: 'Bob', age: '69' }
    import { parse } from 'web-csv-toolbox';

    const csv = `Alice,42
    Bob,69`;

    for await (const record of parse(csv, { headers: ['name', 'age'] })) {
    console.log(record);
    }
    // Prints:
    // { name: 'Alice', age: '42' }
    // { name: 'Bob', age: '69' }

    Support for AbortSignal / AbortController, enabling you to cancel ongoing asynchronous CSV processing tasks.

    This feature is useful for scenarios where processing needs to be halted, such as when a user navigates away from the page or other conditions that require stopping the task early.

    import { parse } from 'web-csv-toolbox';

    const controller = new AbortController();
    const csv = "name,age\nAlice,30\nBob,25";

    try {
    // Parse the CSV data then pass the AbortSignal to the parse function
    for await (const record of parse(csv, { signal: controller.signal })) {
    console.log(record);
    }
    } catch (error) {
    if (error instanceof DOMException && error.name === 'AbortError') {
    // The CSV processing was aborted by the user
    console.log('CSV processing was aborted by the user.');
    } else {
    // An error occurred during CSV processing
    console.error('An error occurred:', error);
    }
    }

    // Some abort logic, like a cancel button
    document.getElementById('cancel-button')
    .addEventListener('click', () => {
    controller.abort();
    });
    import { parse } from 'web-csv-toolbox';

    // Set up a timeout of 5 seconds (5000 milliseconds)
    const signal = AbortSignal.timeout(5000);

    const csv = "name,age\nAlice,30\nBob,25";

    try {
    // Pass the AbortSignal to the parse function
    const result = await parse.toArray(csv, { signal });
    console.log(result);
    } catch (error) {
    if (error instanceof DOMException && error.name === 'TimeoutError') {
    // Handle the case where the processing was aborted due to timeout
    console.log('CSV processing was aborted due to timeout.');
    } else {
    // Handle other errors
    console.error('An error occurred during CSV processing:', error);
    }
    }
    Versions Status
    20.x โœ…
    18.x โœ…
    OS Chrome FireFox Default
    Windows โœ… โœ… โœ… (Edge)
    macos โœ… โœ… โฌœ (Safari *)
    Linux โœ… โœ… -

    * To Be Tested: I couldn't launch Safari in headless mode on GitHub Actions, so I couldn't verify it, but it probably works.

    • Verify that JavaScript is executable on the Deno. Deno CI

    These APIs are designed for Simplicity and Ease of Use, providing an intuitive and straightforward experience for users.

    • function parse(input[, options]): AsyncIterableIterator<CSVRecord>: ๐Ÿ“‘
      • Parses various CSV input formats into an asynchronous iterable of records.
    • function parse.toArray(input[, options]): Promise<CSVRecord[]>: ๐Ÿ“‘
      • Parses CSV input into an array of records, ideal for smaller data sets.

    The input paramater can be a string, a ReadableStream of strings or Uint8Arrays, or a Uint8Array object, or a ArrayBuffer object, or a Response object.

    These APIs are optimized for Enhanced Performance and Control, catering to users who need more detailed and fine-tuned functionality.

    • function parseString(string[, options]): ๐Ÿ“‘
      • Efficient parsing of CSV strings.
    • function parseBinary(buffer[, options]): ๐Ÿ“‘
      • Parse CSV Binary of ArrayBuffer or Uint8Array.
    • function parseResponse(response[, options]): ๐Ÿ“‘
      • Customized parsing directly from Response objects.
    • function parseStream(stream[, options]): ๐Ÿ“‘
      • Stream-based parsing for larger or continuous data.
    • function parseStringStream(stream[, options]): ๐Ÿ“‘
      • Combines string-based parsing with stream processing.
    • function parseUint8ArrayStream(stream[, options]): ๐Ÿ“‘
      • Parses binary streams with precise control over data types.

    These APIs are built for Advanced Customization and Pipeline Design, ideal for developers looking for in-depth control and flexibility.

    • class LexerTransformer: ๐Ÿ“‘
      • A TransformStream class for lexical analysis of CSV data.
    • class RecordAssemblerTransformer: ๐Ÿ“‘
      • Handles the assembly of parsed data into records.

    These APIs are experimental and may change in the future.

    You can use WebAssembly to parse CSV data for high performance.

    • Parsing with WebAssembly is faster than parsing with JavaScript, but it takes time to load the WebAssembly module.
    • Supports only UTF-8 encoding csv data.
    • Quotation characters are only ". (Double quotation mark)
      • If you pass a different character, it will throw an error.
    import { loadWASM, parseStringWASM } from "web-csv-toolbox";

    // load WebAssembly module
    await loadWASM();

    const csv = "a,b,c\n1,2,3";

    // parse CSV string
    const result = parseStringToArraySyncWASM(csv);
    console.log(result);
    // Prints:
    // [{ a: "1", b: "2", c: "3" }]
    • function loadWASM(): Promise<void>: ๐Ÿ“‘
      • Loads the WebAssembly module.
    • function parseStringToArraySyncWASM(string[, options]): CSVRecord[]: ๐Ÿ“‘
      • Parses CSV strings into an array of records.
    Option Description Default Notes
    delimiter Character to separate fields ,
    quotation Character used for quoting fields "
    headers Custom headers for the parsed records First row If not provided, the first row is used as headers
    signal AbortSignal to cancel processing undefined Allows aborting of long-running operations
    Option Description Default Notes
    charset Character encoding for binary CSV inputs utf-8 See Encoding API Compatibility for the encoding formats that can be specified.
    decompression Decompression algorithm for compressed CSV inputs See DecompressionStream Compatibility.
    ignoreBOM Whether to ignore Byte Order Mark (BOM) false See TextDecoderOptions.ignoreBOM for more information about the BOM.
    fatal Throw an error on invalid characters false See TextDecoderOptions.fatal for more information.

    The easiest way to contribute is to use the library and star repository.

    Feel free to ask questions on GitHub Discussions.

    Please register at GitHub Issues.

    Please support kamiazya.

    Even just a dollar is enough motivation to develop ๐Ÿ˜Š

    This software is released under the MIT License, see LICENSE.

    FOSSA Status