Skip to content

Dsyko/meteor-node-csv

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

meteor-node-csv

node-csv npm wrapped for meteor

Add like so: meteor add dsyko:meteor-node-csv. This package exports the global CSV.

Adding this mrt package is equivalent to:

installing the node package

npm install csv

and including it in your project as CSV

var CSV = require('csv');

This is useful for parsing CSV files to and from javascript arrays/objects.

A future is necessary for this streaming to work correctly. See: Here

Here is an example of using it to parse a User collection to a csv file.

//Using the Router package to create a route, passing the response stream to our function
Meteor.Router.add('/exportUsers/:filename', function() {
	// curl http://localhost:3000/exportUsers/Users.csv
	// Should get a .csv file
	return exportCSV(this.response);
});

var exportCSV = function(responseStream){

   var userStream = createStream();
	// Set up a future, Stream doesn't work properly without it.
	var fut = new Future();
	var users = {};

	//Here this Package is used to parse a stream from an array to a string of CSVs.
   CSV().from(userStream)
	.to(responseStream)
	.transform(function(user, index){
	if(user._id){
	    var dateCreated = new Date(user.createdAt);
	    return [user.profile.name, user.emails[0].address, dateCreated.toString()];
	}else
	    return user;
	})
	.on('error', function(error){
		console.error('Error streaming CSV export: ', error.message);
	})
	.on('end', function(count){
		responseStream.end();
		fut.return();
	});

	//Write table headings for CSV to stream.
    userStream.write(["Name", "Email", "Date Created"]);

	users = Users.find({})

    //Pushing each user into the stream, If we could access the MongoDB driver we could
    //convert the Cursor into a stream directly, making this a lot cleaner.
    users.forEach(function (user) {
        userStream.write(user); //Stream transform takes care of cleanup and formatting.
        count += 1;
        if(count >= users.count())
            userStream.end();
    });

    return fut.wait();
};

//Creates and returns a Duplex(Read/Write) Node stream
//Used to pipe users from .find() Cursor into our CSV stream parser.
var createStream = function(){
	var stream = Npm.require('stream');
	var myStream = new stream.Stream();
	myStream.readable = true;
	myStream.writable = true;

	myStream.write = function (data) {
		myStream.emit('data', data);
		return true; // true means 'yes i am ready for more data now'
		// OR return false and emit('drain') when ready later
	};

	myStream.end = function (data) {
		//Node convention to emit last data with end
		if (arguments.length)
			myStream.write(data);

		// no more writes after end
		myStream.writable = false;
		myStream.emit('end');
	};

	myStream.destroy = function () {
		myStream.writable = false;
	};

	return myStream;
};

About

node-csv npm wrapped for meteor

Resources

Stars

Watchers

Forks

Packages

No packages published