🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

parse-csv

Package Overview
Dependencies
Maintainers
1
Versions
2
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

parse-csv - npm Package Compare versions

Comparing version
0.1.0
to
0.2.0
+272
lib/parser.js
'use strict';
/**
* Module dependencies
*/
var isNumber = require('is-number');
var extend = require('extend-shallow');
var merge = require('mixin-deep');
/**
* Decimal regex
*
* @type {RegExp}
*/
var decimalRe = /^\s*(\+|-)?((\d+([,\.]\d+)?)|([,\.]\d+))\s*$/;
/**
* Create a new `Parser` with the given `options`.
*
* ```js
* var csv = require('parse-csv');
* var parser = new csv.Parser();
* ```
* @param {Options} `options`
* @api public
*/
function Parser(options) {
this.options = merge({}, {
headers: {
included: false,
downcase: true,
upcase: true
},
delimiter: 'tab',
decimalSign: 'comma'
}, options);
}
/**
* Parse CSV or tab-delimited string into a data-grid formatted JavaScript object.
*
* ```js
* var parser = new Parser();
*
* var str = `
* id,fruit,vegetable
* 1,apple,carrot
* 2,orange,corn
* 3,banana,potato`;
*
* var datagrid = parser.parse(str);
*
* // results in:
* // { data:
* // [ [ '1', 'apple', 'carrot' ],
* // [ '2', 'orange', 'corn' ],
* // [ '3', 'banana', 'potato' ] ],
* // header:
* // { names: [ 'id', 'fruit', 'vegetable' ],
* // types: [ '-1': 'string' ] } }
* ```
*
* @param {String} `str`
* @param {Object} `options`
* @return {Object}
* @api public
*/
Parser.prototype.parse = function(str, options) {
if (typeof str !== 'string') {
throw new TypeError('expected a string');
}
var opts = extend({}, this.options, options);
var dataArray = [];
str = str.replace(/(\r|\r\n)/g, '');
// count the number of commas
var numCommas = (str.match(/,/g) || []).length;
// count the number of tabs
var numTabs = (str.match(/\t/g) || []).length;
// set delimiter
var delimiter = ',';
if (opts.delimiter === 'tab') {
delimiter = '\t';
} else if (numTabs > numCommas) {
delimiter = '\t';
}
// strip extra empty lines
str = str.replace(/^\n+|\n+$/g, '');
// Create an array of arrays from the given CSV
dataArray = toArray(str, opts);
// escape out any tabs or returns or new lines
for (var i = dataArray.length - 1; i >= 0; i--) {
for (var j = dataArray[i].length - 1; j >= 0; j--) {
dataArray[i][j] = dataArray[i][j].replace(/([\t\n])/, '\\$1');
}
}
var headerNames = [];
var headerTypes = [];
var numColumns = dataArray[0].length;
var numRows = dataArray.length;
if (opts.headers.included) {
// remove header row
headerNames = dataArray.splice(0, 1)[0];
numRows = dataArray.length;
} else {
// create generic property names if no header names are specified
for (var k = 0; k < numColumns; k++) {
headerNames.push('val' + String(k));
headerTypes.push('');
}
}
if (opts.headers.upcase) {
for (var l = headerNames.length - 1; l >= 0; l--) {
headerNames[l] = headerNames[l].toUpperCase();
}
}
if (opts.headers.downcase) {
for (var m = headerNames.length - 1; m >= 0; m--) {
headerNames[m] = headerNames[m].toLowerCase();
}
}
// test all the rows for proper number of columns.
for (var ii = 0; ii < dataArray.length; ii++) {
var numValues = dataArray[ii].length;
if (numValues != numColumns) {
this.log('Error parsing row ' + String(ii) + '. Wrong number of columns.');
}
}
// test columns for number data type
var numRowsToTest = dataArray.length;
var threshold = 0.9;
for (var iii = 0; iii < headerNames.length; iii++) {
var numFloats = 0;
var numInts = 0;
for (var r = 0; r < numRowsToTest; r++) {
if (dataArray[r]) {
// replace comma with dot if comma is decimal separator
if (opts.decimalSign === 'comma' && decimalRe.test(dataArray[r][iii])) {
dataArray[r][iii] = dataArray[r][iii].replace(",", ".");
}
if (isNumber(dataArray[r][iii])) {
numInts++;
if (String(dataArray[r][iii]).indexOf('.') > 0) {
numFloats++;
}
}
}
}
if ((numInts / numRowsToTest) > threshold) {
if (numFloats > 0) {
headerTypes[i] = 'float';
} else {
headerTypes[i] = 'int';
}
} else {
headerTypes[i] = 'string';
}
}
return {
data: dataArray,
header: {
names: headerNames,
types: headerTypes
}
};
};
/**
* Parse a delimited string into an array of arrays.
*
* The default delimiter is `comma`, this can be
* overriden by passed a different delimiter on
* the `delim` option as a second argument.
*
* This Function is from [Ben Nadel] by way of [Mr Data Converer]
*
* @param {String} `str`
* @param {Object} `options`
* @return {Array}
*/
function toArray(str, options) {
var opts = extend({delim: ','}, options);
// Create a regular expression to parse the CSV values.
var re = new RegExp(
// Delimiters.
'(\\' + opts.delim + '|\\n|^)' +
// Quoted fields.
'(?:"([^"]*(?:""[^"]*)*)"|' +
// Standard fields.
'([^"\\' + opts.delim + '\\n]*))', 'gi');
// Create an array to hold our data. Give the array
// a default empty first row.
var arr = [[]];
// Create an array to hold our individual pattern
// matching groups.
var match = null;
var value;
// Keep looping over the regular expression matches
// until we can no longer find a match.
while (match = re.exec(str)) {
// Get the delimiter that was found.
var matchedDelim = match[1];
// Check to see if the given delimiter has a length
// (is not the start of string) and if it matches
// field delimiter. If it does not, then we can expect
// this delimiter to be a row delimiter.
if (matchedDelim.length && (matchedDelim != opts.delim)) {
// Since we have reached a new row of data,
// add an empty row to our data array.
arr.push([]);
}
// Now that we have our delimiter out of the way,
// let's check to see which kind of value we
// captured (quoted or unquoted).
if (match[2]) {
// We found a quoted value. When we capture
// this value, unescape any double quotes.
value = match[2].replace(/""/g, '"');
} else {
// We found a non-quoted value.
value = match[3];
}
// Now that we have our value string, let's add
// it to the data array.
arr[arr.length - 1].push(value);
}
// Return the parsed data.
return arr;
};
/**
* Expose `Parser`
*/
module.exports = Parser;
'use strict';
/**
* Module dependencies
*/
var isObject = require('isobject');
var extend = require('extend-shallow');
var merge = require('mixin-deep');
/**
* Create a new `Renderer` with the given `options`.
*
* ```js
* var csv = require('parse-csv');
* var renderer = new csv.Renderer();
* ```
* @param {Object} `options`
* @api public
*/
function Renderer(options) {
var defaults = {
headers: {
included: true,
downcase: true,
upcase: true
},
delimiter: 'tab',
decimalSign: 'comma',
outputDataType: 'json',
columnDelimiter: "\t",
rowDelimiter: '\n',
inputHeader: {},
outputHeader: {},
dataSelect: {},
outputText: '',
newline: '\n',
indent: ' ',
commentLine: '//',
commentLineEnd: '',
tableName: 'converter',
useUnderscores: true,
includeWhiteSpace: true,
useTabsForIndent: false
};
this.options = merge({}, defaults, options);
if (this.options.includeWhiteSpace) {
this.options.newline = '\n';
} else {
this.options.indent = '';
this.options.newline = '';
}
};
Renderer.prototype.render = function(method/*, datagrid, options*/) {
var args = [].slice.call(arguments, 1);
return this[method].apply(this, args);
};
/**
* JSON
*/
Renderer.prototype.json = function(datagrid, options) {
var opts = extend({}, this.options, options);
datagrid = extend({}, datagrid);
var data = datagrid.data;
var header = datagrid.header || opts.header;
var newline = opts.newline;
var numRows = data.length;
var numColumns = header.names.length;
var rowOutput;
var res = "[";
for (var i = 0; i < numRows; i++) {
var row = data[i];
res += "{";
for (var j = 0; j < numColumns; j++) {
if ((header.types[j] == "int") || (header.types[j] == "float")) {
rowOutput = row[j] || "null";
} else {
rowOutput = '"' + (row[j] || "") + '"';
}
res += ('"' + header.names[j] + '"' + ":" + rowOutput);
if (j < (numColumns - 1)) {
res += ",";
}
}
res += "}";
if (i < (numRows - 1)) {
res += "," + newline;
}
}
res += "]";
return res;
};
/**
* JSON column arrays.
*/
Renderer.prototype.jsonArrayCols = function(datagrid, options) {
var opts = extend({}, this.options, options);
datagrid = extend({}, datagrid);
var data = datagrid.data;
var header = datagrid.header || opts.header;
var indent = opts.indent;
var newline = opts.newline;
var res = "";
var numRows = data.length;
var numColumns = header.names.length;
res += "{" + newline;
for (var i = 0; i < numColumns; i++) {
res += indent + '"' + header.names[i] + '":[';
for (var j = 0; j < numRows; j++) {
if ((header.types[i] == "int") || (header.types[i] == "float")) {
res += data[j][i] || 0;
} else {
res += '"' + (data[j][i] || "") + '"';
}
if (j < (numRows - 1)) {
res += ",";
}
}
res += "]";
if (i < (numColumns - 1)) {
res += "," + newline;
}
}
res += newline + "}";
return res;
};
/**
* JSON row arrays.
*/
Renderer.prototype.jsonArrayRows = function(datagrid, options) {
var opts = extend({}, this.options, options);
datagrid = extend({}, datagrid);
var data = datagrid.data;
var header = datagrid.header || opts.header;
var indent = opts.indent;
var newline = opts.newline;
var res = "";
var numRows = data.length;
var numColumns = header.names.length;
res += "[" + newline;
for (var i = 0; i < numRows; i++) {
res += indent + "[";
for (var j = 0; j < numColumns; j++) {
if ((header.types[j] == "int") || (header.types[j] == "float")) {
res += data[i][j] || 0;
} else {
res += '"' + (data[i][j] || "") + '"';
}
if (j < (numColumns - 1)) {
res += ",";
}
}
res += "]";
if (i < (numRows - 1)) {
res += "," + newline;
}
}
res += newline + "]";
return res;
};
/**
* JSON dictonary.
*/
Renderer.prototype.jsonDict = function(datagrid, options) {
var opts = extend({}, this.options, options);
datagrid = extend({}, datagrid);
var data = datagrid.data;
var header = datagrid.header || opts.header;
var indent = opts.indent;
var newline = opts.newline;
var res = '';
var numRows = data.length;
var numColumns = header.names.length;
res += '{' + newline;
for (var i = 0; i < numRows; i++) {
res += indent + '"' + data[i][0] + '": ';
if (numColumns == 2) {
res += _fmtVal(i, 1, data);
} else {
res += '{ ';
for (var j = 1; j < numColumns; j++) {
if (j > 1) res += ', ';
res += '"' + header.names[j] + '"' + ":" + _fmtVal(i, j, data);
}
res += '}';
}
if (i < (numRows - 1)) {
res += ',' + newline;
}
}
res += newline + '}';
function _fmtVal(i, j) {
if ((header.types[j] == 'int') || (header.types[j] == "float")) {
return data[i][j] || 0;
} else {
return '"' + (data[i][j] || '') + '"';
}
}
return res;
};
/**
* Actionscript
*/
Renderer.prototype.as = function(datagrid, options) {
var opts = extend({}, this.options, options);
datagrid = extend({}, datagrid);
var data = datagrid.data;
var header = datagrid.header || opts.header;
var newline = opts.newline;
var res = '[';
var numRows = data.length;
var numColumns = header.names.length;
var rowOutput;
for (var i = 0; i < numRows; i++) {
var row = data[i];
res += '{';
for (var j = 0; j < numColumns; j++) {
if ((header.types[j] == 'int') || (header.types[j] == 'float')) {
rowOutput = row[j] || 'null';
} else {
rowOutput = '"' + (row[j] || '') + '"';
}
res += (header.names[j] + ':' + rowOutput);
if (j < (numColumns - 1)) {
res += ',';
}
}
res += '}';
if (i < (numRows - 1)) {
res += ',' + newline;
}
}
res += '];';
return res;
};
/**
* Render a parsed CSV datagrid as ASP / VBScript
*/
Renderer.prototype.asp = function(datagrid, options) {
var opts = extend({}, this.options, options);
datagrid = extend({}, datagrid);
var data = datagrid.data;
var header = datagrid.header || opts.header;
var newline = opts.newline;
var res = "";
var numRows = data.length;
var numColumns = header.names.length;
var rowOutput;
for (var i = 0; i < numRows; i++) {
var row = data[i];
for (var j = 0; j < numColumns; j++) {
if ((header.types[j] == "int") || (header.types[j] == "float")) {
rowOutput = row[j] || "null";
} else {
rowOutput = '"' + (row[j] || "") + '"';
}
res += 'myArray(' + j + ',' + i + ') = ' + rowOutput + newline;
}
res = 'Dim myArray(' + (j - 1) + ',' + (i - 1) + ')' + newline + res;
}
return res;
};
/**
* Render a parsed CSV datagrid as an HTML table
*/
Renderer.prototype.html = function(datagrid, options) {
var opts = extend({}, this.options, options);
datagrid = extend({}, datagrid);
var data = datagrid.data;
var header = datagrid.header || opts.header;
var indent = opts.indent;
var newline = opts.newline;
var res = '';
var numRows = data.length;
var numColumns = header.names.length;
res += '<table>' + newline;
res += indent + '<thead>' + newline;
res += indent + indent + '<tr>' + newline;
for (var i = 0; i < numColumns; i++) {
res += indent + indent + indent + '<th class="' + header.names[i] + '-cell">';
res += header.names[i];
res += '</th>' + newline;
}
res += indent + indent + '</tr>' + newline;
res += indent + '</thead>' + newline;
res += indent + '<tbody>' + newline;
for (var ii = 0; ii < numRows; ii++) {
var row = data[ii];
var rowClassName = '';
if (ii === numRows - 1) {
rowClassName = ' class="lastRow"';
} else if (ii === 0) {
rowClassName = ' class="firstRow"';
}
res += indent + indent + '<tr' + rowClassName + '>' + newline;
for (var iii = 0; iii < numColumns; iii++) {
res += indent + indent + indent + '<td class="' + header.names[iii] + '-cell">';
res += row[iii];
res += '</td>' + newline;
}
res += indent + indent + '</tr>' + newline;
}
res += indent + '</tbody>' + newline;
res += '</table>';
return res;
};
/**
* Render a parsed CSV datagrid as MYSQL
*/
Renderer.prototype.mysql = function(datagrid, options) {
var opts = extend({}, this.options, options);
datagrid = extend({}, datagrid);
var data = datagrid.data;
var header = datagrid.header || opts.header;
var indent = opts.indent;
var newline = opts.newline;
var res = '';
var numRows = data.length;
var numColumns = header.names.length;
var tableName = 'converter';
res += 'CREATE TABLE ' + tableName + ' (' + newline;
res += indent + 'id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,' + newline;
for (var i = 0; i < numColumns; i++) {
var dataType = 'VARCHAR(255)';
if ((header.types[i] == 'int') || (header.types[i] == 'float')) {
dataType = header.types[i].toUpperCase();
}
res += indent + '' + header.names[i] + ' ' + dataType;
if (i < numColumns - 1) {
res += ',';
}
res += newline;
}
res += ');' + newline;
res += 'INSERT INTO ' + tableName + " " + newline + indent + '(';
for (var ii = 0; ii < numColumns; ii++) {
res += header.names[ii];
if (ii < numColumns - 1) {
res += ',';
}
}
res += ') ' + newline + 'VALUES ' + newline;
for (var iii = 0; iii < numRows; iii++) {
res += indent + '(';
for (var j = 0; j < numColumns; j++) {
if ((header.types[j] == 'int') || (header.types[j] == 'float')) {
res += data[iii][j] || 'null';
} else {
res += '\'' + (data[iii][j] || '') + '\'';
}
if (j < numColumns - 1) {
res += ',';
}
}
res += ')';
if (iii < numRows - 1) {
res += "," + newline;
}
}
res += ";";
return res;
};
/**
* Render a parsed CSV datagrid as PHP
*/
Renderer.prototype.php = function(datagrid, options) {
var opts = extend({}, this.options, options);
datagrid = extend({}, datagrid);
var data = datagrid.data;
var header = datagrid.header || opts.header;
var indent = opts.indent;
var newline = opts.newline;
var res = "";
var numRows = data.length;
var numColumns = header.names.length;
var rowOutput;
res += "array(" + newline;
for (var i = 0; i < numRows; i++) {
var row = data[i];
res += indent + "array(";
for (var j = 0; j < numColumns; j++) {
if ((header.types[j] == "int") || (header.types[j] == "float")) {
rowOutput = row[j] || "null";
} else {
rowOutput = '"' + (row[j] || "") + '"';
}
res += ('"' + header.names[j] + '"' + "=>" + rowOutput);
if (j < (numColumns - 1)) {
res += ",";
}
}
res += ")";
if (i < (numRows - 1)) {
res += "," + newline;
}
}
res += newline + ");";
return res;
};
/**
* Python dict.
*/
Renderer.prototype.python = function(datagrid, options) {
var opts = extend({}, this.options, options);
datagrid = extend({}, datagrid);
var data = datagrid.data;
var header = datagrid.header || opts.header;
var newline = opts.newline;
var res = "[";
var numRows = data.length;
var numColumns = header.names.length;
var rowOutput;
for (var i = 0; i < numRows; i++) {
var row = data[i];
res += "{";
for (var j = 0; j < numColumns; j++) {
if ((header.types[j] == "int") || (header.types[j] == "float")) {
rowOutput = row[j] || "None";
} else {
rowOutput = '"' + (row[j] || "") + '"';
}
res += ('"' + header.names[j] + '"' + ":" + rowOutput);
if (j < (numColumns - 1)) {
res += ",";
}
}
res += "}";
if (i < (numRows - 1)) {
res += "," + newline;
}
}
res += "];";
return res;
};
/**
* Ruby
*/
Renderer.prototype.ruby = function(datagrid, options) {
var opts = extend({}, this.options, options);
datagrid = extend({}, datagrid);
var data = datagrid.data;
var header = datagrid.header || opts.header;
var newline = opts.newline;
var res = '';
var numRows = data.length;
var numColumns = header.names.length;
var rowOutput;
res += '[';
for (var i = 0; i < numRows; i++) {
var row = data[i];
res += '{';
for (var j = 0; j < numColumns; j++) {
if ((header.types[j] == 'int') || (header.types[j] == 'float')) {
rowOutput = row[j] || 'nil';
} else {
rowOutput = '"' + (row[j] || '') + '"';
}
res += ('"' + header.names[j] + '"' + '=>' + rowOutput);
if (j < (numColumns - 1)) {
res += ',';
}
}
res += '}';
if (i < (numRows - 1)) {
res += ',' + newline;
}
}
res += '];';
return res;
};
/**
* XML nodes
*/
Renderer.prototype.xml = function(datagrid, options) {
var opts = extend({}, this.options, options);
datagrid = extend({}, datagrid);
var data = datagrid.data;
var header = datagrid.header || opts.header;
var indent = opts.indent;
var newline = opts.newline;
var res = '';
var numRows = data.length;
var numColumns = header.names.length;
res = '<?xml version="1.0" encoding="UTF-8"?>' + newline;
res += '<rows>' + newline;
for (var i = 0; i < numRows; i++) {
var row = data[i];
res += indent + '<row>' + newline;
for (var j = 0; j < numColumns; j++) {
res += indent + indent + '<' + header.names[j] + '>';
res += row[j] || '';
res += '</' + header.names[j] + '>' + newline;
}
res += indent + '</row>' + newline;
}
res += '</rows>';
return res;
};
/**
* XML properties
*/
Renderer.prototype.xmlProperties = function(datagrid, options) {
var opts = extend({}, this.options, options);
datagrid = extend({}, datagrid);
var data = datagrid.data;
var header = datagrid.header || opts.header;
var indent = opts.indent;
var newline = opts.newline;
var res = '';
var numRows = data.length;
var numColumns = header.names.length;
res = '<?xml version="1.0" encoding="UTF-8"?>' + newline;
res += '<rows>' + newline;
for (var i = 0; i < numRows; i++) {
var row = data[i];
res += indent + '<row ';
for (var j = 0; j < numColumns; j++) {
res += header.names[j] + '=';
res += '"' + row[j] + '" ';
}
res += '></row>' + newline;
}
res += '</rows>';
return res;
};
/**
* XML Illustrator
*/
Renderer.prototype.xmlIllustrator = function(datagrid, options) {
var opts = extend({}, this.options, options);
datagrid = extend({}, datagrid);
var data = datagrid.data;
var header = datagrid.header || opts.header;
var indent = opts.indent;
var newline = opts.newline;
var res = "";
var numRows = data.length;
var numColumns = header.names.length;
res = '<?xml version="1.0" encoding="utf-8"?>' + newline;
res += '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20001102//EN" "http://www.w3.org/TR/2000/CR-SVG-20001102/DTD/svg-20001102.dtd" [' + newline;
res += indent + '<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">' + newline;
res += indent + '<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">' + newline;
res += indent + '<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">' + newline;
res += indent + '<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">' + newline;
res += indent + '<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">' + newline;
res += indent + '<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">' + newline;
res += ']>' + newline;
res += '<svg>' + newline;
res += '<variableSets xmlns="&ns_vars;">' + newline;
res += indent + '<variableSet varSetName="binding1" locked="none">' + newline;
res += indent + indent + '<variables>' + newline;
for (var i = 0; i < numColumns; i++) {
res += indent + indent + indent + '<variable varName="' + header.names[i] + '" trait="textcontent" category="&ns_flows;"></variable>' + newline;
}
res += indent + indent + '</variables>' + newline;
res += indent + indent + '<v:sampleDataSets xmlns:v="http://ns.adobe.com/Variables/1.0/" xmlns="http://ns.adobe.com/GenericCustomNamespace/1.0/">' + newline;
for (var ii = 0; ii < numRows; ii++) {
var row = data[ii];
res += indent + indent + indent + '<v:sampleDataSet dataSetName="' + row[0] + '">' + newline;
for (var j = 0; j < numColumns; j++) {
res += indent + indent + indent + indent + '<' + header.names[j] + '>' + newline;
res += indent + indent + indent + indent + indent + '<p>' + row[j] + '</p>' + newline;
res += indent + indent + indent + indent + '</' + header.names[j] + '>' + newline;
}
res += indent + indent + indent + '</v:sampleDataSet>' + newline;
}
res += indent + indent + '</v:sampleDataSets>' + newline;
res += indent + '</variableSet>' + newline;
res += '</variableSets>' + newline;
res += '</svg>' + newline;
return res;
};
/**
* Expose `Renderer`
*/
module.exports = Renderer;
The MIT License (MIT)
Copyright (c) 2014-2016, Jon Schlinkert.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
+90
-2
/*!
* parse-csv <https://github.com/jonschlinkert/parse-csv>
*
* Copyright (c) 2014 Jon Schlinkert, contributors.
* Copyright (c) 2014-2016 Jon Schlinkert, contributors.
* Licensed under the MIT license.

@@ -10,2 +10,90 @@ */

module.exports = require('./lib');
var extend = require('extend-shallow');
var Renderer = require('./lib/renderer');
var Parser = require('./lib/parser');
/**
* Expose `csv`
*/
module.exports = csv;
/**
* Parse a string of CSV to a datagrid and render it using the specified [renderer]().
* The `.json` renderer is used by default.
*
* ```js
* var str = `
* id,fruit,vegetable
* 1,apple,carrot
* 2,orange,corn
* 3,banana,potato`;
*
* var res = csv(str, {headers: {included: true}});
* console.log(res);
* // results in:
* // [{"id":"1","fruit":"apple","vegetable":"carrot"},
* // {"id":"2","fruit":"orange","vegetable":"corn"},
* // {"id":"3","fruit":"banana","vegetable":"potato"}]
* ```
* @param {String} `method` The name of the renderer method to use, or a string of CSV. If CSV, the `.json` method will be used.
* @param {String|Object} `str` String of CSV or options.
* @param {Object} `options`
* @return {String}
* @api public
*/
function csv(method, str, options) {
if (typeof str !== 'string') {
options = str;
str = method;
method = null;
}
if (typeof str !== 'string') {
throw new TypeError('expected csv to be a string');
}
var opts = extend({renderer: 'json'}, options);
method = method || opts.renderer;
var parser = new Parser(options);
var renderer = new Renderer(options);
var datagrid = parser.parse(str);
return renderer.render(method, datagrid);
}
/**
* Parse a string of CSV to a datagrid, format it using one of the `.json*` [renderer]() methods,
* then parse it back to JSON.
*
* ```js
* var str = `
* id,fruit,vegetable
* 1,apple,carrot
* 2,orange,corn
* 3,banana,potato`;
*
* var res = csv.toJSON('jsonDict', str, {headers: {included: true}});
* console.log(res);
* // results in:
* // { '1': { fruit: 'apple', vegetable: 'carrot' },
* // '2': { fruit: 'orange', vegetable: 'corn' },
* // '3': { fruit: 'banana', vegetable: 'potato' } }
* ```
* @param {String} `method` The name of the renderer method to use, or a string of CSV. If CSV, the `.json` method will be used.
* @param {String|Object} `str` String of CSV or options.
* @param {Object} `options`
* @return {String}
* @api public
*/
module.exports.toJSON = function(method, str, options) {
if (typeof str === 'string' && !/^json/.test(method)) {
throw new Error('a json* renderer must be specified with the .toJSON method');
}
return JSON.parse(csv.apply(null, arguments));
};
module.exports.Renderer = Renderer;
module.exports.Parser = Parser;
+39
-20
{
"name": "parse-csv",
"description": "CSV parser for node.js.",
"version": "0.1.0",
"version": "0.2.0",
"homepage": "https://github.com/jonschlinkert/parse-csv",
"author": {
"name": "Jon Schlinkert",
"url": "https://github.com/jonschlinkert"
},
"repository": {
"type": "git",
"url": "git://github.com/jonschlinkert/parse-csv.git"
},
"author": "Jon Schlinkert (https://github.com/jonschlinkert)",
"repository": "jonschlinkert/parse-csv",
"bugs": {
"url": "https://github.com/jonschlinkert/parse-csv/issues"
},
"licenses": [
{
"type": "MIT",
"url": "https://github.com/jonschlinkert/parse-csv/blob/master/LICENSE-MIT"
}
"license": "MIT",
"files": [
"index.js",
"lib"
],

@@ -28,14 +21,40 @@ "main": "index.js",

"scripts": {
"test": "mocha -R spec"
"test": "mocha"
},
"dependencies": {
"extend-shallow": "^2.0.1",
"is-number": "^2.1.0",
"isobject": "^2.1.0",
"mixin-deep": "^1.1.3"
},
"devDependencies": {
"mocha": "*",
"should": "*"
"gulp-format-md": "^0.1.9",
"mocha": "^2.4.5"
},
"keywords": [
"csv",
"parse"
],
"dependencies": {
"lodash": "^2.4.1"
"verb": {
"plugins": [
"gulp-format-md"
],
"reflinks": [
"verb"
],
"toc": true,
"layout": "default",
"lint": {
"reflinks": true
},
"tasks": [
"readme"
],
"related": {
"list": [
"parser-csv",
"gulp-convert"
]
}
}
}
+311
-19

@@ -1,20 +0,31 @@

# parse-csv [![NPM version](https://badge.fury.io/js/parse-csv.svg)](http://badge.fury.io/js/parse-csv)
# parse-csv [![NPM version](https://img.shields.io/npm/v/parse-csv.svg?style=flat)](https://www.npmjs.com/package/parse-csv) [![NPM downloads](https://img.shields.io/npm/dm/parse-csv.svg?style=flat)](https://npmjs.org/package/parse-csv) [![Build Status](https://img.shields.io/travis/jonschlinkert/parse-csv.svg?style=flat)](https://travis-ci.org/jonschlinkert/parse-csv)
> CSV parser for node.js.
CSV parser for node.js.
Based on [mr-data-converter](https://github.com/shancarter/mr-data-converter) by [@shancarter](https://github.com/shancarter).
## TOC
- [Install](#install)
- [Usage](#usage)
- [API](#api)
* [Available renderers](#available-renderers)
- [Options](#options)
* [Parser options](#parser-options)
* [Renderer options](#renderer-options)
- [Related projects](#related-projects)
- [Contributing](#contributing)
- [Building docs](#building-docs)
- [Running tests](#running-tests)
- [Author](#author)
- [License](#license)
## Install
### Install with [npm](npmjs.org)
```bash
npm i parse-csv --save
Install with [npm](https://www.npmjs.com/):
```sh
$ npm install parse-csv --save
```
## Run tests
Based on [mr-data-converter](https://github.com/shancarter/mr-data-converter) by [@shancarter](https://github.com/shancarter). Copyright (c) 2011 Shan Carter.
```bash
npm test
```
## Usage

@@ -24,2 +35,12 @@

var csv = require('parse-csv');
var str = [
'id,fruit,vegetable',
'1,apple,carrot',
'2,orange,corn',
'3,banana,potato'
].join('\n');
var obj = csv.toJSON(str, {headers: {included: true}});
console.log(obj);
```

@@ -29,20 +50,291 @@

### [csv](index.js#L45)
Parse a string of CSV to a datagrid and render it using the specified [renderer](#renderer). The `.json` renderer is used by default.
**Params**
* `method` **{String}**: The name of the renderer method to use, or a string of CSV. If CSV, the `.json` method will be used.
* `str` **{String|Object}**: String of CSV or options.
* `options` **{Object}**
* `returns` **{String}**
**Example**
```js
var str = `
id,fruit,vegetable
1,apple,carrot
2,orange,corn
3,banana,potato`;
var res = csv(str, {headers: {included: true}});
console.log(res);
// results in:
// [{"id":"1","fruit":"apple","vegetable":"carrot"},
// {"id":"2","fruit":"orange","vegetable":"corn"},
// {"id":"3","fruit":"banana","vegetable":"potato"}]
```
### [.toJSON](index.js#L90)
Parse a string of CSV to a datagrid, format it using one of the `.json*` [renderer](#renderer) methods, then parse it back to JSON.
**Params**
* `method` **{String}**: The name of the renderer method to use, or a string of CSV. If CSV, the `.json` method will be used.
* `str` **{String|Object}**: String of CSV or options.
* `options` **{Object}**
* `returns` **{String}**
**Example**
```js
var str = `
id,fruit,vegetable
1,apple,carrot
2,orange,corn
3,banana,potato`;
var res = csv.toJSON('jsonDict', str, {headers: {included: true}});
console.log(res);
// results in:
// { '1': { fruit: 'apple', vegetable: 'carrot' },
// '2': { fruit: 'orange', vegetable: 'corn' },
// '3': { fruit: 'banana', vegetable: 'potato' } }
```
### [Parser](lib/parser.js#L30)
Create a new `Parser` with the given `options`.
**Params**
* `options` **{Options}**
**Example**
```js
var csv = require('parse-csv');
var parser = new csv.Parser();
```
### [.parse](lib/parser.js#L72)
Parse CSV or tab-delimited string into a data-grid formatted JavaScript object.
**Params**
* `str` **{String}**
* `options` **{Object}**
* `returns` **{Object}**
**Example**
```js
var parser = new Parser();
var str = `
id,fruit,vegetable
1,apple,carrot
2,orange,corn
3,banana,potato`;
var datagrid = parser.parse(str);
// results in:
// { data:
// [ [ '1', 'apple', 'carrot' ],
// [ '2', 'orange', 'corn' ],
// [ '3', 'banana', 'potato' ] ],
// header:
// { names: [ 'id', 'fruit', 'vegetable' ],
// types: [ '-1': 'string' ] } }
```
### [Renderer](lib/renderer.js#L22)
Create a new `Renderer` with the given `options`.
**Params**
* `options` **{Object}**
**Example**
```js
var csv = require('parse-csv');
var renderer = new csv.Renderer();
```
### Available renderers
The following render methods are available when the renderer is used directly. Or specify the renderer on `options.renderer` when using the main export function.
* `.as`: Actionscript
* `.asp`: ASP/VBScript
* `.html`: HTML
* `.json`: JSON - Properties
* `.jsonArrayCols`: JSON - Column Arrays
* `.jsonArrayRows`: JSON - Row Arrays
* `.jsonDict`: JSON - Dictionary
* `.mysql`: MySQL
* `.php`: PHP
* `.python`: Python - Dict
* `.ruby`: Ruby
* `.xmlProperties`: XML - Properties
* `.xml`: XML - Nodes
* `.xmlIllustrator`: XML - Illustrator
**Example**
To render CSV as HTML:
```js
var csv = require('parse-csv');
var renderer = new csv.Renderer();
var str = `
id,fruit,vegetable
1,apple,carrot
2,orange,corn
3,banana,potato`;
var html = renderer.html(str, {headers: {included: true}});
console.log(html);
```
Results in:
```html
<table>
<thead>
<tr>
<th class="id-cell">id</th>
<th class="fruit-cell">fruit</th>
<th class="vegetable-cell">vegetable</th>
</tr>
</thead>
<tbody>
<tr class="firstRow">
<td class="id-cell">1</td>
<td class="fruit-cell">apple</td>
<td class="vegetable-cell">carrot</td>
</tr>
<tr>
<td class="id-cell">2</td>
<td class="fruit-cell">orange</td>
<td class="vegetable-cell">corn</td>
</tr>
<tr class="lastRow">
<td class="id-cell">3</td>
<td class="fruit-cell">banana</td>
<td class="vegetable-cell">potato</td>
</tr>
</tbody>
</table>
```
## Options
### Parser options
Available parser options and the actual defaults used.
```js
{
headers: {
included: false,
downcase: true,
upcase: true
},
delimiter: 'tab',
decimalSign: 'comma'
}
```
### Renderer options
Available renderer options and the actual defaults used.
```js
{
headers: {
included: true,
downcase: true,
upcase: true
},
delimiter: 'tab',
decimalSign: 'comma',
outputDataType: 'json',
columnDelimiter: "\t",
rowDelimiter: '\n',
inputHeader: {},
outputHeader: {},
dataSelect: {},
outputText: '',
newline: '\n',
indent: ' ',
commentLine: '//',
commentLineEnd: '',
tableName: 'converter',
useUnderscores: true,
includeWhiteSpace: true,
useTabsForIndent: false
}
```
## Related projects
You might also be interested in these projects:
* [gulp-convert](https://www.npmjs.com/package/gulp-convert): Gulp plugin to convert to or from JSON, YAML, XML, PLIST or CSV. | [homepage](https://github.com/assemble/gulp-convert)
* [parser-csv](https://www.npmjs.com/package/parser-csv): CSV parser, compatible with [parser-cache]. | [homepage](https://github.com/jonschlinkert/parser-csv)
## Contributing
Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/parse-csv/issues)
Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/parse-csv/issues/new).
## Building docs
Generate readme and API documentation with [verb](https://github.com/verbose/verb):
```sh
$ npm install verb && npm run docs
```
Or, if [verb](https://github.com/verbose/verb) is installed globally:
```sh
$ verb
```
## Running tests
Install dev dependencies:
```sh
$ npm install -d && npm test
```
## Author
**Jon Schlinkert**
+ [github/jonschlinkert](https://github.com/jonschlinkert)
+ [twitter/jonschlinkert](http://twitter.com/jonschlinkert)
* [github/jonschlinkert](https://github.com/jonschlinkert)
* [twitter/jonschlinkert](http://twitter.com/jonschlinkert)
## License
Copyright (c) 2014 Jon Schlinkert
Copyright (c) 2011 Shan Carter
Released under the MIT license
Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert).
Released under the [MIT license](https://github.com/jonschlinkert/parse-csv/blob/master/LICENSE).
***
_This file was generated by [verb](https://github.com/assemble/verb) on November 21, 2014._
_This file was generated by [verb](https://github.com/verbose/verb), v0.9.0, on May 09, 2016._
# Enforce Unix newlines
*.* text eol=lf
*.css text eol=lf
*.html text eol=lf
*.js text eol=lf
*.json text eol=lf
*.less text eol=lf
*.md text eol=lf
*.yml text eol=lf
*.jpg binary
*.gif binary
*.png binary
*.jpeg binary
{
"asi": false,
"boss": true,
"curly": true,
"eqeqeq": true,
"eqnull": true,
"esnext": true,
"immed": true,
"latedef": true,
"laxcomma": false,
"newcap": true,
"noarg": true,
"node": true,
"sub": true,
"undef": true,
"unused": true,
"mocha": true
}

Sorry, the diff of this file is not supported yet

# {%= name %} {%= badge("fury") %}
> {%= description %}
Based on [mr-data-converter](https://github.com/shancarter/mr-data-converter) by [@shancarter](https://github.com/shancarter).
## Install
{%= include("install-npm", {save: true}) %}
## Run tests
```bash
npm test
```
## Usage
```js
var csv = require('{%= name %}');
```
## API
{%= comments("index.js") %}
## Contributing
Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue]({%= bugs.url %})
## Author
{%= include("author") %}
## License
{%= copyright() %}
Copyright (c) 2011 Shan Carter
{%= license() %}
***
{%= include("footer") %}
// var render = require('./lib/render.js');
var csv = require('./lib/');
var data = [
'id,fruit,vegetable',
'1,apple,carrot',
'2,orange,corn',
'3,banana,potato'
].join('\n');
console.log(csv.jsonDict(data, {headers: {included: true}}));
console.log(csv.to('jsonDict', data, {headers: {included: true}}));
'use strict';
/**
* Module dependencies
*/
var _ = require('lodash');
/**
* Decimal regex
*
* @type {RegExp}
*/
var decimalRe = /^\s*(\+|-)?((\d+([,\.]\d+)?)|([,\.]\d+))\s*$/;
/**
* Expose `csv`
*/
var csv = module.exports;
/**
* Parse CSV or tab-delimited string into a data
* grid-formatted JavaScript object.
*
* @param {String} `str`
* @param {Object} `options`
* @return {Object}
*/
csv.parse = function(str, options) {
str = str.replace(/\r/g, '');
var opts = _.defaults({}, options, {
headers: {
included: false,
downcase: true,
upcase: true
},
delimiter: 'tab',
decimalSign: 'comma'
});
var dataArray = [];
// count the number of commas
var numCommas = str.replace(/[^,]/g, '').length;
// count the number of tabs
var numTabs = str.replace(/[^\t]/g, '').length;
// set delimiter
var delimiter = ',';
if (opts.delimiter === 'tab') {
delimiter = '\t';
} else if (numTabs > numCommas) {
delimiter = '\t';
}
// strip extra empty lines
str = str.replace(/^\n+|\n+$/g, '');
// Create an array of arrays from the given CSV
dataArray = toArray(str, opts);
// escape out any tabs or returns or new lines
for (var i = dataArray.length - 1; i >= 0; i--) {
for (var j = dataArray[i].length - 1; j >= 0; j--) {
dataArray[i][j] = dataArray[i][j].replace(/([\t\n])/, '\\$1');
}
}
var headerNames = [];
var headerTypes = [];
var numColumns = dataArray[0].length;
var numRows = dataArray.length;
if (opts.headers.included) {
// remove header row
headerNames = dataArray.splice(0, 1)[0];
numRows = dataArray.length;
} else {
// create generic property names if no header names are specified
for (var k = 0; k < numColumns; k++) {
headerNames.push('val' + String(k));
headerTypes.push('');
}
}
if (opts.headers.upcase) {
for (var l = headerNames.length - 1; l >= 0; l--) {
headerNames[l] = headerNames[l].toUpperCase();
}
}
if (opts.headers.downcase) {
for (var m = headerNames.length - 1; m >= 0; m--) {
headerNames[m] = headerNames[m].toLowerCase();
}
}
// test all the rows for proper number of columns.
for (var ii = 0; ii < dataArray.length; ii++) {
var numValues = dataArray[ii].length;
if (numValues != numColumns) {
this.log('Error parsing row ' + String(ii) + '. Wrong number of columns.');
}
}
// test columns for number data type
var numRowsToTest = dataArray.length;
var threshold = 0.9;
for (var iii = 0; iii < headerNames.length; iii++) {
var numFloats = 0;
var numInts = 0;
for (var r = 0; r < numRowsToTest; r++) {
if (dataArray[r]) {
// replace comma with dot if comma is decimal separator
if (opts.decimalSign === 'comma' && decimalRe.test(dataArray[r][iii])) {
dataArray[r][iii] = dataArray[r][iii].replace(",", ".");
}
if (isNumber(dataArray[r][iii])) {
numInts++;
if (String(dataArray[r][iii]).indexOf('.') > 0) {
numFloats++;
}
}
}
}
if ((numInts / numRowsToTest) > threshold) {
if (numFloats > 0) {
headerTypes[i] = 'float';
} else {
headerTypes[i] = 'int';
}
} else {
headerTypes[i] = 'string';
}
}
return {
data: dataArray,
header: {
names: headerNames,
types: headerTypes
}
};
};
/**
* Parse a delimited string into an array of arrays.
*
* The default delimiter is `comma`, this can be
* overriden by passed a different delimiter on
* the `delim` option as a second argument.
*
* This Function is from [Ben Nadel] by way of [Mr Data Converer]
*
* @param {String} `str`
* @param {Object} `options`
* @return {Array}
*/
function toArray(str, options) {
var opts = _.extend({delim: ','}, options);
// Create a regular expression to parse the CSV values.
var re = new RegExp(
// Delimiters.
'(\\' + opts.delim + '|\\n|^)' +
// Quoted fields.
'(?:"([^"]*(?:""[^"]*)*)"|' +
// Standard fields.
'([^"\\' + opts.delim + '\\n]*))', 'gi'
);
// Create an array to hold our data. Give the array
// a default empty first row.
var arr = [[]];
// Create an array to hold our individual pattern
// matching groups.
var match = null;
var value;
// Keep looping over the regular expression matches
// until we can no longer find a match.
while (match = re.exec(str)) {
// Get the delimiter that was found.
var matchedDelim = match[1];
// Check to see if the given delimiter has a length
// (is not the start of string) and if it matches
// field delimiter. If it does not, then we can expect
// this delimiter to be a row delimiter.
if (matchedDelim.length && (matchedDelim != opts.delim)) {
// Since we have reached a new row of data,
// add an empty row to our data array.
arr.push([]);
}
// Now that we have our delimiter out of the way,
// let's check to see which kind of value we
// captured (quoted or unquoted).
if (match[2]) {
// We found a quoted value. When we capture
// this value, unescape any double quotes.
value = match[2].replace(/""/g, '"');
} else {
// We found a non-quoted value.
value = match[3];
}
// Now that we have our value string, let's add
// it to the data array.
arr[arr.length - 1].push(value);
}
// Return the parsed data.
return arr;
}
//---------------------------------------
// UTILS
//---------------------------------------
function isNumber(string) {
if ((string == null) || isNaN(Number(string))) {
return false;
}
return true;
}
'use strict';
var render = require('./render');
Object.keys(render).forEach(function (type) {
module.exports[type] = function (data, options) {
return render(type, data, options);
};
});
module.exports.to = render;
'use strict';
/**
* Module dependencies
*/
var csv = require('./csv');
var _ = require('lodash');
/**
* Expose `render`
*/
module.exports = render;
function render(type, data, options) {
var parsed;
var res = '';
if (typeof type !== 'string') {
options = type;
type = 'json';
}
var converter = render[type];
var defaults = {
headers: {
included: true,
downcase: true,
upcase: true
},
delimiter: 'tab',
decimalSign: 'comma',
outputDataType: 'json',
columnDelimiter: "\t",
rowDelimiter: '\n',
inputHeader: {},
outputHeader: {},
dataSelect: {},
outputText: '',
newline: '\n',
indent: ' ',
commentLine: '//',
commentLineEnd: '',
tableName: 'converter',
useUnderscores: true,
includeWhiteSpace: true,
useTabsForIndent: false
};
var opts = _.extend(defaults, options);
// make sure there is input data before converting...
if (data && data.length > 0) {
if (opts.includeWhiteSpace) {
opts.newline = '\n';
} else {
opts.indent = '';
opts.newline = '';
}
parsed = csv.parse(data, opts);
opts.header = parsed.header;
res = converter(parsed.data, opts);
}
return res;
}
render.as = function as(datagrid, options) {
var opts = _.extend({}, options);
var header = opts.header;
var newline = opts.newline;
var res = '[';
var numRows = datagrid.length;
var numColumns = header.names.length;
var rowOutput;
for (var i = 0; i < numRows; i++) {
var row = datagrid[i];
res += '{';
for (var j = 0; j < numColumns; j++) {
if ((header.types[j] == 'int') || (header.types[j] == 'float')) {
rowOutput = row[j] || 'null';
} else {
rowOutput = '"' + (row[j] || '') + '"';
}
res += (header.names[j] + ':' + rowOutput);
if (j < (numColumns - 1)) {
res += ',';
}
}
res += '}';
if (i < (numRows - 1)) {
res += ',' + newline;
}
}
res += '];';
return res;
};
//---------------------------------------
// ASP / VBScript
//---------------------------------------
render.asp = function asp(datagrid, options) {
var opts = _.extend({}, options);
var header = opts.header;
var newline = opts.newline;
var res = "";
var numRows = datagrid.length;
var numColumns = header.names.length;
var rowOutput;
for (var i = 0; i < numRows; i++) {
var row = datagrid[i];
for (var j = 0; j < numColumns; j++) {
if ((header.types[j] == "int") || (header.types[j] == "float")) {
rowOutput = row[j] || "null";
} else {
rowOutput = '"' + (row[j] || "") + '"';
}
res += 'myArray(' + j + ',' + i + ') = ' + rowOutput + newline;
}
res = 'Dim myArray(' + (j - 1) + ',' + (i - 1) + ')' + newline + res;
}
return res;
};
//---------------------------------------
// HTML Table
//---------------------------------------
render.html = function html(datagrid, options) {
var opts = _.extend({}, options);
var header = opts.header;
var indent = opts.indent;
var newline = opts.newline;
var res = '';
var numRows = datagrid.length;
var numColumns = header.names.length;
res += '<table>' + newline;
res += indent + '<thead>' + newline;
res += indent + indent + '<tr>' + newline;
for (var i = 0; i < numColumns; i++) {
res += indent + indent + indent + '<th class="' + header.names[i] + '-cell">';
res += header.names[i];
res += '</th>' + newline;
}
res += indent + indent + '</tr>' + newline;
res += indent + '</thead>' + newline;
res += indent + '<tbody>' + newline;
for (var ii = 0; ii < numRows; ii++) {
var row = datagrid[ii];
var rowClassName = '';
if (ii === numRows - 1) {
rowClassName = ' class="lastRow"';
} else if (ii === 0) {
rowClassName = ' class="firstRow"';
}
res += indent + indent + '<tr' + rowClassName + '>' + newline;
for (var iii = 0; iii < numColumns; iii++) {
res += indent + indent + indent + '<td class="' + header.names[iii] + '-cell">';
res += row[iii];
res += '</td>' + newline;
}
res += indent + indent + '</tr>' + newline;
}
res += indent + '</tbody>' + newline;
res += '</table>';
return res;
};
//---------------------------------------
// JSON properties
//---------------------------------------
render.json = function json(datagrid, options) {
var opts = _.extend({}, options);
var header = opts.header;
var newline = opts.newline;
var res = "[";
var numRows = datagrid.length;
var numColumns = header.names.length;
var rowOutput;
for (var i = 0; i < numRows; i++) {
var row = datagrid[i];
res += "{";
for (var j = 0; j < numColumns; j++) {
if ((header.types[j] == "int") || (header.types[j] == "float")) {
rowOutput = row[j] || "null";
} else {
rowOutput = '"' + (row[j] || "") + '"';
}
res += ('"' + header.names[j] + '"' + ":" + rowOutput);
if (j < (numColumns - 1)) {
res += ",";
}
}
res += "}";
if (i < (numRows - 1)) {
res += "," + newline;
}
}
res += "]";
return res;
};
//---------------------------------------
// JSON Array of Columns
//---------------------------------------
render.jsonArrayCols = function jsonArrayCols(datagrid, options) {
var opts = _.extend({}, options);
var header = opts.header;
var indent = opts.indent;
var newline = opts.newline;
var res = "";
var numRows = datagrid.length;
var numColumns = header.names.length;
res += "{" + newline;
for (var i = 0; i < numColumns; i++) {
res += indent + '"' + header.names[i] + '":[';
for (var j = 0; j < numRows; j++) {
if ((header.types[i] == "int") || (header.types[i] == "float")) {
res += datagrid[j][i] || 0;
} else {
res += '"' + (datagrid[j][i] || "") + '"';
}
if (j < (numRows - 1)) {
res += ",";
}
}
res += "]";
if (i < (numColumns - 1)) {
res += "," + newline;
}
}
res += newline + "}";
return res;
};
//---------------------------------------
// JSON Array of Rows
//---------------------------------------
render.jsonArrayRows = function jsonArrayRows(datagrid, options) {
var opts = _.extend({}, options);
var header = opts.header;
var indent = opts.indent;
var newline = opts.newline;
var res = "";
var numRows = datagrid.length;
var numColumns = header.names.length;
res += "[" + newline;
for (var i = 0; i < numRows; i++) {
res += indent + "[";
for (var j = 0; j < numColumns; j++) {
if ((header.types[j] == "int") || (header.types[j] == "float")) {
res += datagrid[i][j] || 0;
} else {
res += '"' + (datagrid[i][j] || "") + '"';
}
if (j < (numColumns - 1)) {
res += ",";
}
}
res += "]";
if (i < (numRows - 1)) {
res += "," + newline;
}
}
res += newline + "]";
return res;
};
//---------------------------------------
// JSON Dictionary
//---------------------------------------
render.jsonDict = function jsonDict(datagrid, options) {
var opts = _.extend({}, options);
var header = opts.header;
var indent = opts.indent;
var newline = opts.newline;
var res = '';
var numRows = datagrid.length;
var numColumns = header.names.length;
res += '{' + newline;
for (var i = 0; i < numRows; i++) {
res += indent + '"' + datagrid[i][0] + '": ';
if (numColumns == 2) {
res += _fmtVal(i, 1, datagrid);
} else {
res += '{ ';
for (var j = 1; j < numColumns; j++) {
if (j > 1) res += ', ';
res += '"' + header.names[j] + '"' + ":" + _fmtVal(i, j, datagrid);
}
res += '}';
}
if (i < (numRows - 1)) {
res += ',' + newline;
}
}
res += newline + '}';
function _fmtVal(i, j) {
if ((header.types[j] == 'int') || (header.types[j] == "float")) {
return datagrid[i][j] || 0;
} else {
return '"' + (datagrid[i][j] || '') + '"';
}
}
return res;
};
//---------------------------------------
// MYSQL
//---------------------------------------
render.mysql = function mysql(datagrid, options) {
var opts = _.extend({}, options);
var header = opts.header;
var indent = opts.indent;
var newline = opts.newline;
var res = '';
var numRows = datagrid.length;
var numColumns = header.names.length;
var tableName = 'converter';
res += 'CREATE TABLE ' + tableName + ' (' + newline;
res += indent + 'id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,' + newline;
for (var i = 0; i < numColumns; i++) {
var dataType = 'VARCHAR(255)';
if ((header.types[i] == 'int') || (header.types[i] == 'float')) {
dataType = header.types[i].toUpperCase();
}
res += indent + '' + header.names[i] + ' ' + dataType;
if (i < numColumns - 1) {
res += ',';
}
res += newline;
}
res += ');' + newline;
res += 'INSERT INTO ' + tableName + " " + newline + indent + '(';
for (var ii = 0; ii < numColumns; ii++) {
res += header.names[ii];
if (ii < numColumns - 1) {
res += ',';
}
}
res += ') ' + newline + 'VALUES ' + newline;
for (var iii = 0; iii < numRows; iii++) {
res += indent + '(';
for (var j = 0; j < numColumns; j++) {
if ((header.types[j] == 'int') || (header.types[j] == 'float')) {
res += datagrid[iii][j] || 'null';
} else {
res += '\'' + (datagrid[iii][j] || '') + '\'';
}
if (j < numColumns - 1) {
res += ',';
}
}
res += ')';
if (iii < numRows - 1) {
res += "," + newline;
}
}
res += ";";
return res;
};
//---------------------------------------
// PHP
//---------------------------------------
render.php = function php(datagrid, options) {
var opts = _.extend({}, options);
var header = opts.header;
var indent = opts.indent;
var newline = opts.newline;
var res = "";
var numRows = datagrid.length;
var numColumns = header.names.length;
var rowOutput;
res += "array(" + newline;
for (var i = 0; i < numRows; i++) {
var row = datagrid[i];
res += indent + "array(";
for (var j = 0; j < numColumns; j++) {
if ((header.types[j] == "int") || (header.types[j] == "float")) {
rowOutput = row[j] || "null";
} else {
rowOutput = '"' + (row[j] || "") + '"';
}
res += ('"' + header.names[j] + '"' + "=>" + rowOutput);
if (j < (numColumns - 1)) {
res += ",";
}
}
res += ")";
if (i < (numRows - 1)) {
res += "," + newline;
}
}
res += newline + ");";
return res;
};
//---------------------------------------
// Python dict
//---------------------------------------
render.python = function python(datagrid, options) {
var opts = _.extend({}, options);
var header = opts.header;
var newline = opts.newline;
var res = "[";
var numRows = datagrid.length;
var numColumns = header.names.length;
var rowOutput;
for (var i = 0; i < numRows; i++) {
var row = datagrid[i];
res += "{";
for (var j = 0; j < numColumns; j++) {
if ((header.types[j] == "int") || (header.types[j] == "float")) {
rowOutput = row[j] || "None";
} else {
rowOutput = '"' + (row[j] || "") + '"';
}
res += ('"' + header.names[j] + '"' + ":" + rowOutput);
if (j < (numColumns - 1)) {
res += ",";
}
}
res += "}";
if (i < (numRows - 1)) {
res += "," + newline;
}
}
res += "];";
return res;
};
//---------------------------------------
// Ruby
//---------------------------------------
render.ruby = function ruby(datagrid, options) {
var opts = _.extend({}, options);
var header = opts.header;
var newline = opts.newline;
var res = '';
var numRows = datagrid.length;
var numColumns = header.names.length;
var rowOutput;
res += '[';
for (var i = 0; i < numRows; i++) {
var row = datagrid[i];
res += '{';
for (var j = 0; j < numColumns; j++) {
if ((header.types[j] == 'int') || (header.types[j] == 'float')) {
rowOutput = row[j] || 'nil';
} else {
rowOutput = '"' + (row[j] || '') + '"';
}
res += ('"' + header.names[j] + '"' + '=>' + rowOutput);
if (j < (numColumns - 1)) {
res += ',';
}
}
res += '}';
if (i < (numRows - 1)) {
res += ',' + newline;
}
}
res += '];';
return res;
};
//---------------------------------------
// XML Nodes
//---------------------------------------
render.xml = function xml(datagrid, options) {
var opts = _.extend({}, options);
var header = opts.header;
var indent = opts.indent;
var newline = opts.newline;
var res = '';
var numRows = datagrid.length;
var numColumns = header.names.length;
res = '<?xml version="1.0" encoding="UTF-8"?>' + newline;
res += '<rows>' + newline;
for (var i = 0; i < numRows; i++) {
var row = datagrid[i];
res += indent + '<row>' + newline;
for (var j = 0; j < numColumns; j++) {
res += indent + indent + '<' + header.names[j] + '>';
res += row[j] || '';
res += '</' + header.names[j] + '>' + newline;
}
res += indent + '</row>' + newline;
}
res += '</rows>';
return res;
};
//---------------------------------------
// XML properties
//---------------------------------------
render.xmlProperties = function xmlProperties(datagrid, options) {
var opts = _.extend({}, options);
var header = opts.header;
var indent = opts.indent;
var newline = opts.newline;
var res = '';
var numRows = datagrid.length;
var numColumns = header.names.length;
res = '<?xml version="1.0" encoding="UTF-8"?>' + newline;
res += '<rows>' + newline;
for (var i = 0; i < numRows; i++) {
var row = datagrid[i];
res += indent + '<row ';
for (var j = 0; j < numColumns; j++) {
res += header.names[j] + '=';
res += '"' + row[j] + '" ';
}
res += '></row>' + newline;
}
res += '</rows>';
return res;
};
//---------------------------------------
// XML Illustrator
//---------------------------------------
render.xmlIllustrator = function xmlIllustrator(datagrid, options) {
var opts = _.extend({}, options);
var header = opts.header;
var indent = opts.indent;
var newline = opts.newline;
var res = "";
var numRows = datagrid.length;
var numColumns = header.names.length;
res = '<?xml version="1.0" encoding="utf-8"?>' + newline;
res += '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20001102//EN" "http://www.w3.org/TR/2000/CR-SVG-20001102/DTD/svg-20001102.dtd" [' + newline;
res += indent + '<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">' + newline;
res += indent + '<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">' + newline;
res += indent + '<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">' + newline;
res += indent + '<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">' + newline;
res += indent + '<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">' + newline;
res += indent + '<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">' + newline;
res += ']>' + newline;
res += '<svg>' + newline;
res += '<variableSets xmlns="&ns_vars;">' + newline;
res += indent + '<variableSet varSetName="binding1" locked="none">' + newline;
res += indent + indent + '<variables>' + newline;
for (var i = 0; i < numColumns; i++) {
res += indent + indent + indent + '<variable varName="' + header.names[i] + '" trait="textcontent" category="&ns_flows;"></variable>' + newline;
}
res += indent + indent + '</variables>' + newline;
res += indent + indent + '<v:sampleDataSets xmlns:v="http://ns.adobe.com/Variables/1.0/" xmlns="http://ns.adobe.com/GenericCustomNamespace/1.0/">' + newline;
for (var ii = 0; ii < numRows; ii++) {
var row = datagrid[ii];
res += indent + indent + indent + '<v:sampleDataSet dataSetName="' + row[0] + '">' + newline;
for (var j = 0; j < numColumns; j++) {
res += indent + indent + indent + indent + '<' + header.names[j] + '>' + newline;
res += indent + indent + indent + indent + indent + '<p>' + row[j] + '</p>' + newline;
res += indent + indent + indent + indent + '</' + header.names[j] + '>' + newline;
}
res += indent + indent + indent + '</v:sampleDataSet>' + newline;
}
res += indent + indent + '</v:sampleDataSets>' + newline;
res += indent + '</variableSet>' + newline;
res += '</variableSets>' + newline;
res += '</svg>' + newline;
return res;
};

Sorry, the diff of this file is not supported yet