# edi-parser

> EDI parser with simple api, full of options and tested against large datasets. Based on node-csv-parser

Latest version **1.0.1** (published 2016-12-29) · 0 weekly downloads

## Install

```sh
npm install edi-parser
pnpm add edi-parser
yarn add edi-parser
bun add edi-parser
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.0.1 |
| Published | 2016-12-29 |
| First published | 2016-12-29 |
| Weekly downloads | 0 |
| TypeScript types | none |
| Module format | CommonJS |
| Node | >= 0.1.90 |
| Dependencies | 0 |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 44 |
| Author | Rinie Kervel |
| Maintainers | swilson1337 |
| Keywords | parser, edi |

## Links

- npm: https://www.npmjs.com/package/edi-parser
- Repository: https://github.com/rinie/node-edi-parser
- Issues: https://github.com/rinie/node-edi-parser/issues
- npm.io page: https://npm.io/package/edi-parser

## Alternatives

- [memory-cache](https://npm.io/package/memory-cache.md) — 795.0K weekly downloads
- [@httptoolkit/proxy-agent](https://npm.io/package/@httptoolkit/proxy-agent.md) — 11.2K weekly downloads
- [express-cache-controller](https://npm.io/package/express-cache-controller.md) — 5.3K weekly downloads
- [http-cache-middleware](https://npm.io/package/http-cache-middleware.md) — 4.5K weekly downloads
- [cache2](https://npm.io/package/cache2.md) — 1.5K weekly downloads

## Recent versions

- 1.0.1 (latest) — 2016-12-29
- 1.0.0 — 2016-12-29

## README

<pre>			 
 _   _           _       _____  
Node-EDI-Parser
</pre>

This project provide EDI parsing and has been tested and used on large source file (over 2Gb).

-   Support delimiter, quote and escape characters
-   Line breaks discovery: line breaks in source are detected and reported to destination
-   Data transformation
-   Asynch and event based
-   Support for large datasets
-   Complete test coverage as sample and inspiration

Quick example
-------------

Using the library is a 4 steps process:

1.	Create a source
2.	Create a destination (optional)
3.	Transform the data (optional)
4.  Listen to events (optional)

Here is a example:

	// node samples/sample.js
	var edi = require('edi');
	
	edi()
	.fromPath(__dirname+'/sample.in')
	.toPath(__dirname+'/sample.out')
	.transform(function(data){
		data.unshift(data.pop());
		return data;
	})
	.on('data',function(data,index){
		console.log('#'+index+' '+JSON.stringify(data));
	})
	.on('end',function(count){
		console.log('Number of lines: '+count);
	})
	.on('error',function(error){
		console.log(error.message);
	});
	
	// Print sth like:
	// #0 ["2000-01-01","20322051544","1979.0","8.8017226E7","ABC","45"]
	// #1 ["2050-11-27","28392898392","1974.0","8.8392926E7","DEF","23"]
	// Number of lines: 2

Installing
----------

Via git (or downloaded tarball):

    $ git clone http://github.com/rinie/node-edi-parser.git

Then, simply copy or link the ./lib/edi.js file into your $HOME/.node_libraries folder or inside a declared path folder.

Via [npm](http://github.com/isaacs/npm):

    $ npm install edi

Reading API
-----------

The following method are available:

-   *fromPath(data, options)*    
    Take a file path as first argument and optionally on object of options as a second arguments.
    
-   *fromStream(readStream, options)*    
    Take a readable stream as first argument and optionally on object of options as a second arguments.
    
-   *from(data, options)*    
    Take a string, a buffer, an array or an object as first argument and optionally some options as a second arguments.

Options are:

-   *delimiter*    
    Set the field delimiter, one character only, default to comma.
    
-   *quote*    
    Set the field delimiter, one character only, default to double quotes.
    
-   *escape*    
    Set the field delimiter, one character only, default to double quotes.
    
-   *columns*    
    List of fields or true if autodiscovered in the first edi line, impact the `transform` argument and the `data` event by providing an object instead of an array, order matters, see the transform and the columns section below.
	
-   *encoding*    
    Default to 'utf8', apply when a readable stream is created.
	
-   *trim*    
    If true, ignore whitespace immediately around the delimiter, default to false.
	
-   *ltrim*    
    If true, ignore whitespace immediately following the delimiter (i.e. left-trim all fields), default to false.
	
-   *rtrim*    
    If true, ignore whitespace immediately preceding the delimiter (i.e. right-trim all fields), default to false.

Writing API
-----------

The following method are available:

-   *write(data, preserve)*    
    Take a string, an array or an object, implementation of the StreamWriter API.
	
-   *end()*    
    Terminate the stream, implementation of the StreamWriter API.
    
-   *toPath(path, options)*    
    Take a file path as first argument and optionally on object of options as a second arguments.
    
-   *toStream(writeStream, options)*    
    Take a readable stream as first argument and optionally on object of options as a second arguments.

Options are:

-   *delimiter*    
    Default to the delimiter read option.
    
-   *quote*    
    Default to the quote read option.
    
-   *escape*    
    Default to the escape read option.
    
-   *columns*    
    List of fields, apply when `transform` return an object, order matters, see the transform and the columns sections below.
    
-   *encoding*    
    Default to 'utf8', apply when a writable stream is created.
    
-   *header*
    Display the column names on the first line if the columns option is provided.

-   *lineBreaks*    
    String used to delimit record rows or a special value; special values are 'auto', 'unix', 'mac', 'windows', 'unicode'; default to 'auto' (discovered in source or 'unix' if no source is specified).
    
-   *flags*    
    Default to 'w', 'w' to create or overwrite an file, 'a' to append to a file. Apply when using the `toPath` method.
    
-   *bufferSize*    
    Internal buffer holding data before being flush into a stream. Apply when destination is a stream.
    
-   *end*    
    Prevent calling `end` on the destination, so that destination is no longer writable, similar to passing `{end: false}` option in `stream.pipe()`.

-   *newColumns*
    If the `columns` option is not specified (which means columns will be taken from the reader
    options, will automatically append new columns if they are added during `transform()`.

Transforming data
-----------------

-   *transform(callback)*
    User provided function call on each line to filter, enriche or modify the dataset. The callback is called asynchronously.

The contract is quite simple, you receive an array of fields for each record and return the transformed record. The return value may be an array, an associative array, a string or null. If null, the record will simply be skipped.

Unless you specify the `columns` read option, `data` are provided as arrays, otherwise they are objects with keys matching columns names.

When the returned value is an array, the fields are merge in order. When the returned value is an object, it will search for the `columns` property in the write or in the read options and smartly order the values. If no `columns` options are found, it will merge the values in their order of appearance. When the returned value is a string, it is directly sent to the destination source and it is your responsibility to delimit, quote, escape or define line breaks.

Example of transform returning a string

	// node samples/transform.js
	var edi = require('edi');
	
	edi()
	.fromPath(__dirname+'/transform.in')
	.toStream(process.stdout)
	.transform(function(data,index){
		return (index>0 ? ',' : '') + data[0] + ":" + data[2] + ' ' + data[1];
	});
	
	// Print sth like:
	// 82:Zbigniew Preisner,94:Serge Gainsbourg

Events
------

By extending the Node `EventEmitter` class, the library provide a few useful events:

-	*data* (function(data, index){})
    Thrown when a new row is parsed after the `transform` callback and with the data being the value returned by `transform`. Note however that the event won't be call if transform return `null` since the record is skipped.
	The callback provide two arguments:
	`data` is the edi line being processed (by default as an array)
	`index` is the index number of the line starting at zero
    
-   *end*
    In case your redirecting the output to a file using the `toPath` method, the event will be called once the writing process is complete and the file closed.
    
-   *error*
    Thrown whenever an error is captured.

Columns
-------

Columns names may be provided or discovered in the first line with the read options `columns`. If defined as an array, the order must match the one of the input source. If set to `true`, the fields are expected to be present in the first line of the input source.

You can define a different order and even different columns in the read options and in the write options. If the `columns` is not defined in the write options, it will default to the one present in the read options. 

When working with fields, the `transform` method and the `data` events receive their `data` parameter as an object instead of an array where the keys are the field names.

	// node samples/column.js
	var edi = require('edi');
	
	edi()
	.fromPath(__dirname+'/columns.in',{
		columns: true
	})
	.toStream(process.stdout,{
		columns: ['id', 'name']
	})
	.transform(function(data){
		data.name = data.firstname + ' ' + data.lastname
		return data;
	});
	
	// Print sth like:
	// 82,Zbigniew Preisner
	// 94,Serge Gainsbourg

Running the tests
-----------------

Tests are executed with expresso. To install it, simple use `npm install -g expresso`.

To run the tests
	expresso test

Contributors
------------

*	David Worms : <https://github.com/wdavidw>
*	Will White : <https://github.com/willwhite>
*	Justin Latimer : <https://github.com/justinlatimer>
*	jonseymour : <https://github.com/jonseymour>
*	pascalopitz : <https://github.com/pascalopitz>
*	Josh Pschorr : <https://github.com/jpschorr>
*   Elad Ben-Israel: <https://github.com/eladb>

Related projects
----------------

*   Pavel Kolesnikov "ya-edi": <http://github.com/koles/ya-edi>
*   Chris Williams "node-edi": <http://github.com/voodootikigod/node-edi>

---
_Source: https://npm.io/package/edi-parser · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
