PHPackages                             sanix-darker/cisv - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [PDF &amp; Document Generation](/categories/documents)
4. /
5. sanix-darker/cisv

ArchivedPhp-ext[PDF &amp; Document Generation](/categories/documents)

sanix-darker/cisv
=================

High-performance CSV parser with SIMD optimizations (AVX-512/AVX2) for PHP - 10-50x faster than fgetcsv

v0.4.8(2mo ago)216[9 issues](https://github.com/Sanix-Darker/cisv-php/issues)MITCPHP &gt;=8.1CI passing

Since Mar 6Pushed 2mo agoCompare

[ Source](https://github.com/Sanix-Darker/cisv-php)[ Packagist](https://packagist.org/packages/sanix-darker/cisv)[ Docs](https://github.com/Sanix-Darker/cisv-php)[ RSS](/packages/sanix-darker-cisv/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (10)Dependencies (4)Versions (70)Used By (0)

CISV
====

[](#cisv)

[![License](https://camo.githubusercontent.com/b8cadaa967891081f8f165695470689986c028821dd8a040132f6e661795dc0d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c7565)](https://camo.githubusercontent.com/b8cadaa967891081f8f165695470689986c028821dd8a040132f6e661795dc0d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c7565)[![Build](https://camo.githubusercontent.com/b0c6c6845a74cb65a7f0a32bdcfd8fbf80eeb40026c4029af424ab371c94b8bd/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6275696c642d70617373696e672d627269676874677265656e)](https://camo.githubusercontent.com/b0c6c6845a74cb65a7f0a32bdcfd8fbf80eeb40026c4029af424ab371c94b8bd/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6275696c642d70617373696e672d627269676874677265656e)[![Ask DeepWiki](https://camo.githubusercontent.com/0f5ae213ac378635adeb5d7f13cef055ad2f7d9a47b36de7b1c67dbe09f609ca/68747470733a2f2f6465657077696b692e636f6d2f62616467652e737667)](https://deepwiki.com/Sanix-Darker/cisv)

DEPRECATED REPOSITORY
---------------------

[](#deprecated-repository)

This monorepo is deprecated and no longer the primary source for installs/releases.

Use the split repositories instead:

- Core C library:
- CLI:
- PHP binding:
- Node.js binding:
- Python binding:

High-performance CSV parser and writer with SIMD optimizations (AVX-512/AVX2). Available as a C library, CLI tool, and bindings for Node.js, Python, and PHP.

Blog post: [How I accidentally created the fastest CSV parser ever made](https://sanixdk.xyz/blogs/how-i-accidentally-created-the-fastest-csv-parser-ever-made)

FEATURES
--------

[](#features)

- SIMD-accelerated parsing (AVX-512, AVX2, with scalar fallback)
- Zero-copy memory-mapped file processing
- Streaming API for large files
- Row-by-row iterator API (fgetcsv-style) with early exit support
- Configurable delimiters, quotes, escapes, and comments
- Field transforms (uppercase, lowercase, trim, hash, base64, etc.)
- Parallel chunk processing for multi-threaded parsing
- RFC 4180 compliant with relaxed mode option
- CSV writer with SIMD optimization

PERFORMANCE
-----------

[](#performance)

Benchmarks on Intel Core i5-8365U:

TestThroughputSimple CSV165-290 MB/sQuoted fields175-189 MB/sLarge fields153-169 MB/sBenchmark reports are generated by `scripts/benchmark_cli.sh` in CI and committed per binding:

- `BENCHMARKS_CLI.md`
- `BENCHMARKS_NODEJS.md`
- `BENCHMARKS_PYTHON.md`
- `BENCHMARKS_PHP.md`

INSTALLATION
------------

[](#installation)

### BUILD FROM SOURCE

[](#build-from-source)

```
git clone https://github.com/sanix-darker/cisv
cd cisv
make all
```

### INSTALL CLI

[](#install-cli)

```
sudo make install-cli
```

### NODE.JS

[](#nodejs)

```
cd bindings/nodejs
npm install
npm run build
```

### PYTHON

[](#python)

```
cd bindings/python
pip install -e .
```

### PHP

[](#php)

```
cd bindings/php
phpize
./configure
make
sudo make install
```

CLI USAGE
---------

[](#cli-usage)

```
cisv [OPTIONS] FILE

Options:
  -d, --delimiter CHAR   Field delimiter (default: ,)
  -q, --quote CHAR       Quote character (default: ")
  -e, --escape CHAR      Escape character
  -m, --comment CHAR     Comment line prefix
  -t, --trim             Trim whitespace from fields
  -r, --relaxed          Relaxed parsing mode
  -c, --count            Count rows only
  -s, --select COLS      Select columns by index
  -o, --output FILE      Output file
  -b, --benchmark        Benchmark mode
  --skip-empty           Skip empty lines
  --skip-errors          Skip lines with errors
  --from-line N          Start at line N
  --to-line N            Stop at line N
  --head N               First N rows
  --tail N               Last N rows
```

### EXAMPLES

[](#examples)

```
# Parse CSV
cisv data.csv

# Parse TSV
cisv -d $'\t' data.tsv

# Count rows
cisv -c data.csv

# Select columns 0, 2, 5
cisv -s 0,2,5 data.csv

# Benchmark
cisv -b data.csv

# Parse lines 100-500
cisv --from-line 100 --to-line 500 data.csv
```

### CSV WRITER

[](#csv-writer)

```
cisv write [OPTIONS]

Options:
  -g, --generate N       Generate N test rows
  -o, --output FILE      Output file
  -d, --delimiter CHAR   Field delimiter
  -Q, --always-quote     Quote all fields
  -r, --crlf             Use CRLF line endings
  -n, --null TEXT        NULL representation
```

DOCKER BENCHMARKS
-----------------

[](#docker-benchmarks)

```
docker build -t cisv-benchmark .
docker run --rm --cpus="2.0" --memory="4g" cisv-benchmark
```

Per-component benchmark environments (useful when local tools are missing):

```
# CLI tools benchmark
docker build -t cisv-cli-bench -f cli/benchmarks/Dockerfile .
docker run --rm --platform linux/amd64 --cpus=2 --memory=4g cisv-cli-bench

# Node.js benchmark
docker build -t cisv-node-bench -f bindings/nodejs/benchmarks/Dockerfile .
docker run --rm --platform linux/amd64 --cpus=2 --memory=4g cisv-node-bench

# PHP benchmark
docker build -t cisv-php-bench -f bindings/php/benchmarks/Dockerfile .
docker run --rm --platform linux/amd64 --cpus=2 --memory=4g cisv-php-bench

# Python (nanobind) benchmark
docker build -t cisv-pynb-bench -f bindings/python-nanobind/benchmarks/Dockerfile .
docker run --rm --platform linux/amd64 --cpus=2 --memory=4g cisv-pynb-bench
```

C API
-----

[](#c-api)

```
#include
#include
#include

// Callbacks
void on_field(void *user, const char *data, size_t len);
void on_row(void *user);

// Parse file
cisv_config cfg;
cisv_config_init(&cfg);
cfg.field_cb = on_field;
cfg.row_cb = on_row;
cfg.delimiter = ',';

cisv_parser *p = cisv_parser_create_with_config(&cfg);
cisv_parser_parse_file(p, "data.csv");
cisv_parser_destroy(p);

// Count rows (fast mode)
size_t count = cisv_parser_count_rows("data.csv");

// Row-by-row iterator (fgetcsv-style, supports early exit)
cisv_iterator_t *it = cisv_iterator_open("data.csv", &cfg);
const char **fields;
const size_t *lengths;
size_t field_count;
while (cisv_iterator_next(it, &fields, &lengths, &field_count) == CISV_ITER_OK) {
    // Process row - fields valid until next call
    if (should_stop) break;  // Early exit supported
}
cisv_iterator_close(it);

// Parallel processing
cisv_mmap_file_t *file = cisv_mmap_open("data.csv");
int chunk_count;
cisv_chunk_t *chunks = cisv_split_chunks(file, 4, &chunk_count);
// Parse chunks in parallel threads
cisv_mmap_close(file);
```

NODE.JS API
-----------

[](#nodejs-api)

```
const { cisvParser } = require('cisv');

// Parse file
const parser = new cisvParser({ delimiter: ',', quote: '"', trim: true });
const rows = parser.parseSync('data.csv');

// Parse with transforms
parser.transform(0, 'uppercase')
      .transform(1, 'trim')
      .transform(2, (value) => value.toUpperCase());
const transformedRows = parser.parseSync('data.csv');

// Name-based transforms
parser.setHeaderFields(['id', 'name', 'email']);
parser.transformByName('name', 'uppercase');

// Stream parsing
const streamParser = new cisvParser();
streamParser.write(chunk);
streamParser.end();
const results = streamParser.getRows();

// Row-by-row iteration (memory efficient, supports early exit)
const iterParser = new cisvParser({ delimiter: ',' });
iterParser.openIterator('large.csv');
let row;
while ((row = iterParser.fetchRow()) !== null) {
    console.log(row);
    if (row[0] === 'stop') break;  // Early exit
}
iterParser.closeIterator();

// Fast row counting
const total = cisvParser.countRows('large.csv');
```

PYTHON API
----------

[](#python-api)

```
import cisv

# Parse file
rows = cisv.parse_file('data.csv', delimiter=',', trim=True)

# Parse string
rows = cisv.parse_string('a,b,c\n1,2,3')

# Count rows (fast)
count = cisv.count_rows('data.csv')

# Row-by-row iteration (memory efficient, supports early exit)
with cisv.CisvIterator('large.csv') as reader:
    for row in reader:
        print(row)
        if row[0] == 'stop':
            break  # Early exit - no wasted work

# Or use the convenience function
for row in cisv.open_iterator('data.csv'):
    process(row)
```

PHP API
-------

[](#php-api)

```
