web-csv-toolbox v0.11.0
๐ web-csv-toolbox ๐งฐ
A CSV Toolbox utilizing Web Standard APIs.
๐
Key Concepts โจ
- ๐ Web Standards first.
- Utilizing the Web Standards APIs, such as the Web Streams API.
- โค๏ธ TypeScript friendly & User friendly.
- Fully typed and documented.
- 0๏ธโฃ Zero dependencies.
- Using only Web Standards APIs.
- ๐ช Property-based testing.
- Using fast-check and vitest.
- โ
Cross-platform.
- Works on browsers, Node.js, and Deno.
Key Features ๐
- ๐ 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.
- โ Integrate with
- ๐จ Flexible Source Support
- ๐งฉ Parse CSVs directly from
string
s,ReadableStream
s, orResponse
objects.
- ๐งฉ Parse CSVs directly from
- โ๏ธ Advanced Parsing Options: Customize your experience with various delimiters and quotation marks.
- ๐ Defaults to
,
and"
respectively.
- ๐ Defaults to
- ๐พ 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.
Installation ๐ฅ
With Package manager ๐ฆ
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
From CDN (unpkg.com) ๐
UMD Style ๐
<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>
ESModule Style ๐ฆ
<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>
Deno ๐ฆ
You can install and use the package by specifying the following:
import { parse } from "npm:web-csv-toolbox";
Usage ๐
Parsing CSV files from strings
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' }
Parsing CSV files from ReadableStream
s
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' }
Parsing CSV files from Response
objects
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' }
Parsing CSV files with different delimiters and quotation characters
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' }
Parsing CSV files with headers
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' }
AbortSignal
/ AbortController
Support
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.
Example Use Case: Abort with user action
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();
});
Example Use Case: Abort with timeout
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);
}
}
Supported Runtimes ๐ป
Works on Node.js
Versions | Status |
---|---|
20.x | โ |
18.x | โ |
Works on Browser
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.
Others
APIs ๐งโ๐ป
High-level APIs ๐
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 string
s or Uint8Arrays,
or a Uint8Array object,
or a ArrayBuffer object,
or a Response object.
Middle-level APIs ๐งฑ
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.
- Customized parsing directly from
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.
Low-level APIs โ๏ธ
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.
Experimental APIs ๐งช
These APIs are experimental and may change in the future.
Parsing using WebAssembly for high performance.
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.
Options Configuration ๐ ๏ธ
Common Options โ๏ธ
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 |
Advanced Options (Binary-Specific) ๐งฌ
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. |
How to Contribute ๐ช
Star โญ
The easiest way to contribute is to use the library and star repository.
Questions ๐ญ
Feel free to ask questions on GitHub Discussions.
Report bugs / request additional features ๐ก
Please register at GitHub Issues.
Financial Support ๐ธ
Please support kamiazya.
Even just a dollar is enough motivation to develop ๐
License โ๏ธ
This software is released under the MIT License, see LICENSE.
11 months ago
1 year ago
1 year ago
11 months ago
1 year ago
1 year ago
11 months ago
1 year ago
1 year ago
1 year ago
1 year ago
11 months ago
11 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
11 months ago
11 months ago
11 months ago
12 months ago
1 year ago
1 year ago
11 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
11 months ago
1 year ago
1 year ago
12 months ago
1 year ago
1 year ago
11 months ago
1 year ago
1 year ago
11 months ago
1 year ago
11 months ago
11 months ago
1 year ago
11 months ago
11 months ago
1 year ago
1 year ago
1 year ago
11 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago