You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
240 lines
6.7 KiB
240 lines
6.7 KiB
var helper = require('./helper.js');
|
|
module.exports = {
|
|
toObject : toObject,
|
|
toArray : toArray,
|
|
toColumnArray : toColumnArray,
|
|
toSchemaObject : toSchemaObject,
|
|
toCSV : toCSV
|
|
}
|
|
|
|
|
|
function toColumnArray(data, opts){
|
|
|
|
opts = opts || { };
|
|
|
|
var delimiter = (opts.delimiter || ',');
|
|
var quote = helper.getQuoteChar(opts.quote);
|
|
var content = data;
|
|
var headers = null;
|
|
|
|
if(typeof(content) !== "string"){
|
|
throw new Error("Invalid input, input data should be a string");
|
|
}
|
|
|
|
content = content.split(/[\n\r]+/ig);
|
|
|
|
if(typeof(opts.headers) === "string"){
|
|
headers = opts.headers.split(/[\n\r]+/ig);
|
|
headers = quote ?
|
|
helper.convertArray(headers.shift(), delimiter, quote) :
|
|
headers.shift().split(delimiter);
|
|
}else{
|
|
headers = quote ?
|
|
helper.convertArray(content.shift(), delimiter, quote) :
|
|
content.shift().split(delimiter);
|
|
}
|
|
|
|
|
|
var hashData = { };
|
|
|
|
headers.forEach(function(item){
|
|
hashData[item] = [];
|
|
});
|
|
|
|
content.forEach(function(item){
|
|
if(item){
|
|
item = quote ?
|
|
helper.convertArray(item, delimiter, quote) :
|
|
item.split(delimiter);
|
|
item.forEach(function(val, index){
|
|
hashData[headers[index]].push(helper.removeQuote(val));
|
|
});
|
|
}
|
|
});
|
|
|
|
return hashData;
|
|
}
|
|
|
|
function toObject(data, opts){
|
|
|
|
opts = opts || { };
|
|
|
|
var delimiter = (opts.delimiter || ',');
|
|
var quote = helper.getQuoteChar(opts.quote);
|
|
var content = data;
|
|
var headers = null;
|
|
|
|
if(typeof(content) !== "string"){
|
|
throw new Error("Invalid input, input data should be a string");
|
|
}
|
|
|
|
content = content.split(/[\n\r]+/ig);
|
|
|
|
if(typeof(opts.headers) === "string"){
|
|
headers = opts.headers.split(/[\n\r]+/ig);
|
|
headers = quote ?
|
|
helper.convertArray(headers.shift(), delimiter, quote) :
|
|
headers.shift().split(delimiter);
|
|
}else{
|
|
headers = quote ?
|
|
helper.convertArray(content.shift(), delimiter, quote) :
|
|
content.shift().split(delimiter);
|
|
}
|
|
|
|
var hashData = [ ];
|
|
content.forEach(function(item){
|
|
if(item){
|
|
item = quote ?
|
|
helper.convertArray(item, delimiter, quote) :
|
|
item.split(delimiter);
|
|
var hashItem = { };
|
|
headers.forEach(function(headerItem, index){
|
|
hashItem[headerItem] = helper.removeQuote(item[index]);
|
|
});
|
|
hashData.push(hashItem);
|
|
}
|
|
});
|
|
return hashData;
|
|
}
|
|
|
|
function toSchemaObject(data, opts){
|
|
|
|
opts = opts || { };
|
|
|
|
var delimiter = (opts.delimiter || ',');
|
|
var quote = helper.getQuoteChar(opts.quote);
|
|
var content = data;
|
|
var headers = null;
|
|
if(typeof(content) !== "string"){
|
|
throw new Error("Invalid input, input should be a string");
|
|
}
|
|
|
|
content = content.split(/[\n\r]+/ig);
|
|
|
|
|
|
if(typeof(opts.headers) === "string"){
|
|
headers = opts.headers.split(/[\n\r]+/ig);
|
|
headers = quote ?
|
|
helper.convertArray(headers.shift(), delimiter, quote) :
|
|
headers.shift().split(delimiter);
|
|
}else{
|
|
headers = quote ?
|
|
helper.convertArray(content.shift(), delimiter, quote) :
|
|
content.shift().split(delimiter);
|
|
}
|
|
|
|
|
|
var hashData = [ ];
|
|
|
|
content.forEach(function(item){
|
|
if(item){
|
|
item = quote ?
|
|
helper.convertArray(item, delimiter, quote) :
|
|
item.split(delimiter);
|
|
var schemaObject = {};
|
|
item.forEach(function(val, index){
|
|
helper.addDataInSchema(headers[index], val, schemaObject , delimiter, quote);
|
|
});
|
|
hashData.push(schemaObject);
|
|
}
|
|
});
|
|
|
|
return hashData;
|
|
}
|
|
|
|
function toArray(data, opts){
|
|
|
|
opts = opts || { };
|
|
|
|
var delimiter = (opts.delimiter || ',');
|
|
var quote = helper.getQuoteChar(opts.quote);
|
|
var content = data;
|
|
|
|
if(typeof(content) !== "string"){
|
|
throw new Error("Invalid input, input data should be a string");
|
|
}
|
|
|
|
content = content.split(/[\n\r]+/ig);
|
|
var arrayData = [ ];
|
|
content.forEach(function(item){
|
|
if(item){
|
|
item = quote ?
|
|
helper.convertArray(item, delimiter, quote) :
|
|
item.split(delimiter);
|
|
|
|
item = item.map(function(cItem){
|
|
return helper.removeQuote(cItem);
|
|
});
|
|
arrayData.push(item);
|
|
}
|
|
});
|
|
return arrayData;
|
|
}
|
|
|
|
function toCSV(data, opts){
|
|
|
|
opts = (opts || { });
|
|
opts.delimiter = (opts.delimiter || ',');
|
|
opts.wrap = (opts.wrap || '');
|
|
opts.arrayDenote = (opts.arrayDenote && String(opts.arrayDenote).trim() ? opts.arrayDenote : '[]');
|
|
opts.objectDenote = (opts.objectDenote && String(opts.objectDenote).trim() ? opts.objectDenote : '.');
|
|
opts.detailedOutput = (typeof(opts.detailedOutput) !== "boolean" ? true : opts.detailedOutput);
|
|
opts.headers = String(opts.headers).toLowerCase();
|
|
var csvJSON = { };
|
|
var csvData = "";
|
|
|
|
if(!opts.headers.match(/none|full|relative|key/)){
|
|
opts.headers = 'full';
|
|
}else{
|
|
opts.headers = opts.headers.match(/none|full|relative|key/)[0];
|
|
}
|
|
|
|
if(opts.wrap === true){
|
|
opts.wrap = '"';
|
|
}
|
|
|
|
if(typeof(data) === "string"){
|
|
data = JSON.parse(data);
|
|
}
|
|
|
|
helper.toCsv(data, csvJSON, "", 0, opts);
|
|
|
|
var headers = helper.getHeaders(opts.headers, csvJSON, opts);
|
|
|
|
if(headers){
|
|
if(opts.wrap){
|
|
headers = headers.map(function(item){
|
|
return opts.wrap + item + opts.wrap;
|
|
});
|
|
}
|
|
csvData = headers.join(opts.delimiter);
|
|
}
|
|
|
|
var bigArrayLen = helper.getLengthyItem(csvJSON);
|
|
var keys = Object.keys(csvJSON);
|
|
var row = [ ];
|
|
|
|
var replaceNewLinePattern = /\n|\r/g;
|
|
if(!opts.wrap){
|
|
replaceNewLinePattern = new RegExp('\n|\r|' + opts.delimiter, 'g');
|
|
}
|
|
|
|
|
|
for(var i = 0; i < bigArrayLen; i++){
|
|
row = [ ];
|
|
for(var j = 0; j < keys.length; j++){
|
|
if(csvJSON[keys[j]][i]){
|
|
csvJSON[keys[j]][i] = csvJSON[keys[j]][i].replace(replaceNewLinePattern, '\t');
|
|
if(opts.wrap){
|
|
csvJSON[keys[j]][i] = opts.wrap + csvJSON[keys[j]][i] + opts.wrap;
|
|
}
|
|
row[row.length] = csvJSON[keys[j]][i];
|
|
}else{
|
|
row[row.length] = "";
|
|
}
|
|
}
|
|
csvData += '\n' + row.join(opts.delimiter);
|
|
}
|
|
return csvData;
|
|
}
|