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.
219 lines
6.1 KiB
219 lines
6.1 KiB
module.exports = {
|
|
getQuoteChar : getQuoteChar,
|
|
dataType : dataType,
|
|
toCsv : toCsv,
|
|
putData : putData,
|
|
allObjsOrArray : allObjsOrArray,
|
|
getHeaders : getHeaders,
|
|
getLengthyItem : getLengthyItem,
|
|
addDataInSchema : addDataInSchema,
|
|
removeQuote : removeQuote,
|
|
arrayToCsv : arrayToCsv,
|
|
objectToCsv : objectToCsv,
|
|
convertArray : convertArray,
|
|
csvToArray : csvToArray
|
|
}
|
|
|
|
function getQuoteChar(q){
|
|
if(typeof(q) === "string"){
|
|
return q;
|
|
}else if(q === true){
|
|
return '"';
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function dataType(arg) {
|
|
if (arg === null) {
|
|
return 'null';
|
|
}
|
|
else if (arg && (arg.nodeType === 1 || arg.nodeType === 9)) {
|
|
return 'element';
|
|
}
|
|
var type = (Object.prototype.toString.call(arg)).match(/\[object (.*?)\]/)[1].toLowerCase();
|
|
if (type === 'number') {
|
|
if (isNaN(arg)) {
|
|
return 'nan';
|
|
}
|
|
if (!isFinite(arg)) {
|
|
return 'infinity';
|
|
}
|
|
}
|
|
return type;
|
|
}
|
|
|
|
|
|
function toCsv(data, table, parent, row, opt){
|
|
if(dataType(data) === 'undefined'){
|
|
return putData('', table, parent, row, opt);
|
|
}else if(dataType(data) === 'null'){
|
|
return putData('null', table, parent, row, opt);
|
|
}else if(Array.isArray(data)){
|
|
return arrayToCsv(data, table, parent, row, opt);
|
|
}else if(typeof(data) === "object"){
|
|
return objectToCsv(data, table, parent, row, opt);
|
|
}else{
|
|
return putData(String(data), table, parent, row, opt);
|
|
}
|
|
}
|
|
|
|
function putData(data, table, parent, row, opt){
|
|
if(!table || !table[parent]){
|
|
table[parent] = [ ];
|
|
}
|
|
if(row < table[parent].length){
|
|
row = table[parent].length;
|
|
}
|
|
table[parent][row] = data;
|
|
return table;
|
|
}
|
|
|
|
|
|
function allObjsOrArray(array){
|
|
return array.every(function(item){
|
|
var datatype = dataType(item);
|
|
if(!datatype.match(/array|object/)){
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
}
|
|
|
|
|
|
function getHeaders(headerType, table, opt){
|
|
var keyMatchPattern = /([^\[\]\.]+)$/;
|
|
var relativeMatchPattern = /\[\]\.?([^\[\]]+)$/;
|
|
switch(headerType){
|
|
case "none":
|
|
return null;
|
|
case "full":
|
|
return Object.keys(table);
|
|
case "key":
|
|
return Object.keys(table).map(function(header){
|
|
var head = header.match(keyMatchPattern);
|
|
if(head && head.length === 2){
|
|
return head[1];
|
|
}
|
|
return header;
|
|
});
|
|
case "relative":
|
|
return Object.keys(table).map(function(header){
|
|
var head = header.match(relativeMatchPattern);
|
|
if(head && head.length === 2){
|
|
return head[1];
|
|
}
|
|
return header;
|
|
});
|
|
}
|
|
}
|
|
|
|
function getLengthyItem(table){
|
|
var len = 0;
|
|
Object.keys(table).forEach(function(item){
|
|
if(Array.isArray(table[item]) && table[item].length > len){
|
|
len = table[item].length;
|
|
}
|
|
});
|
|
return len;
|
|
}
|
|
|
|
function addDataInSchema(header, item, schema, delimiter, quote){
|
|
var match = header.match(/\[*[\d]\]\.(\w+)|\.|\[\]|\[(.)\]|-|\+/ig);
|
|
var headerName, currentPoint;
|
|
if(match){
|
|
var testMatch = match[0];
|
|
if(match.indexOf('-') !== -1){
|
|
return true;
|
|
}else if(match.indexOf('.') !== -1){
|
|
var headParts = header.split('.');
|
|
currentPoint = headParts.shift();
|
|
schema[currentPoint] = schema[currentPoint] || {};
|
|
addDataInSchema(headParts.join('.'), item, schema[currentPoint], delimiter, quote);
|
|
}else if(match.indexOf('[]') !== -1){
|
|
headerName = header.replace(/\[\]/ig,'');
|
|
if(!schema[headerName]){
|
|
schema[headerName] = [];
|
|
}
|
|
schema[headerName].push(item);
|
|
}else if(/\[*[\d]\]\.(\w+)/.test(testMatch)){
|
|
headerName = header.split('[').shift();
|
|
var index = parseInt(testMatch.match(/\[(.)\]/).pop(),10);
|
|
currentPoint = header.split('.').pop();
|
|
schema[headerName] = schema[headerName] || [];
|
|
schema[headerName][index] = schema[headerName][index] || {};
|
|
schema[headerName][index][currentPoint] = item;
|
|
}else if(/\[(.)\]/.test(testMatch)){
|
|
var delimiter = testMatch.match(/\[(.)\]/).pop();
|
|
headerName = header.replace(/\[(.)\]/ig,'');
|
|
schema[headerName] = convertArray(item, delimiter, quote);
|
|
}else if(match.indexOf('+') !== -1){
|
|
headerName = header.replace(/\+/ig,"");
|
|
schema[headerName] = Number(item);
|
|
}
|
|
}else{
|
|
schema[header] = removeQuote(item);
|
|
}
|
|
return schema ;
|
|
}
|
|
|
|
function removeQuote(str){
|
|
if(str){
|
|
return String(str).trim().replace(/^["|'](.*)["|']$/, '$1');
|
|
}
|
|
return "";
|
|
}
|
|
|
|
function arrayToCsv(data, table, parent, row, opt){
|
|
if(allObjsOrArray(data)){
|
|
return putData(data.join(';'), table, parent + opt.arrayDenote, row, opt);
|
|
}
|
|
data.forEach(function(item, index){
|
|
return toCsv(item, table, parent + opt.arrayDenote, index, opt);
|
|
});
|
|
}
|
|
|
|
function objectToCsv(data, table, parent, row, opt){
|
|
Object.keys(data).forEach(function(item){
|
|
return toCsv(data[item], table, parent + opt.objectDenote + item, row, opt);
|
|
});
|
|
}
|
|
|
|
function convertArray(str, delimiter, quote) {
|
|
if(quote && str.indexOf(quote) !== -1){
|
|
return csvToArray(str, delimiter, quote);
|
|
}
|
|
var output = [];
|
|
var arr = str.split(delimiter);
|
|
arr.forEach(function(val) {
|
|
var trimmed = val.trim();
|
|
output.push(trimmed);
|
|
});
|
|
return output;
|
|
}
|
|
|
|
function csvToArray(text, delimit, quote) {
|
|
|
|
delimit = delimit || ",";
|
|
quote = quote || '"';
|
|
|
|
var value = new RegExp("(?!\\s*$)\\s*(?:" + quote + "([^" + quote + "\\\\]*(?:\\\\[\\S\\s][^" + quote + "\\\\]*)*)" + quote + "|([^" + delimit + quote + "\\s\\\\]*(?:\\s+[^" + delimit + quote + "\\s\\\\]+)*))\\s*(?:" + delimit + "|$)", "g");
|
|
|
|
var a = [ ];
|
|
|
|
text.replace(value,
|
|
function(m0, m1, m2) {
|
|
if(m1 !== undefined){
|
|
a.push(m1.replace(/\\'/g, "'"));
|
|
}else if(m2 !== undefined){
|
|
a.push(m2);
|
|
}
|
|
return '';
|
|
}
|
|
);
|
|
|
|
if (/,\s*$/.test(text)){
|
|
a.push('');
|
|
}
|
|
return a;
|
|
}
|