tsbase
Version:
Base class libraries for TypeScript
82 lines • 3.41 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Csv = void 0;
var Query_1 = require("../Patterns/CommandQuery/Query");
var Regex_1 = require("./Regex");
var Strings_1 = require("./Strings");
var Csv = /** @class */ (function () {
function Csv() {
}
/**
* Accepts a json object and returns the CSV string equivalent.
* @param json
*/
Csv.EncodeAsCsv = function (headers, json) {
var _this = this;
var csvConversionResult = new Query_1.Query(function () {
return _this.convertToCSV(json);
}).Execute();
return csvConversionResult.IsSuccess && csvConversionResult.Value ?
"".concat(headers.toString(), "\r\n").concat(csvConversionResult.Value) :
Strings_1.Strings.Empty;
};
/**
* Accepts a csv string amd returns the JSON equivalent object.
* @param csv
* @param headerKeys sequential array of keys for each header in the given csv
* @returns
*/
Csv.DecodeAsJson = function (csv, headerKeys) {
var json = [];
var lines = csv.split('\n');
var headersString = lines.shift();
var headers = headersString && Regex_1.Regex.AggregateMatches(Regex_1.Regex.CsvData, headersString, [], function (match, cv) {
match && cv.push(match[1]);
});
if (!headers || !headerKeys.length || headers.length !== headerKeys.length) {
console.error('Unable to decode CSV to JSON - ensure the given headerKeys is the same length as the CSV headers', "CSV Headers Count: ".concat(headers === null || headers === void 0 ? void 0 : headers.length, " | headerKeys Length: ").concat(headerKeys.length));
return json;
}
var valueString = lines.join('\n');
var recordValues = Regex_1.Regex.AggregateMatches(Regex_1.Regex.CsvData, valueString, [], function (match, cv) {
if (cv.length === 0 || cv[cv.length - 1].length % headers.length === 0) {
cv.push([]);
}
match && cv[cv.length - 1].push(match[1] || '');
});
recordValues.forEach(function (rv) {
var entry = {};
headerKeys.forEach(function (k, i) {
if (k) {
entry[k] = rv[i];
}
});
json.push(entry);
});
return json;
};
// eslint-disable-next-line complexity
Csv.convertToCSV = function (json) {
var items = typeof json !== 'object' ? JSON.parse(json) : json;
var str = Strings_1.Strings.Empty;
for (var i = 0; i < items.length; i++) {
var item = items[i];
var line = Strings_1.Strings.Empty;
for (var key in item) {
if (line !== Strings_1.Strings.Empty) {
line += ',';
}
var value = item[key];
var literalQuotes = (value === null || value === void 0 ? void 0 : value.toString().includes(',')) ? '"' : '';
line += value !== Strings_1.Strings.Empty ?
"".concat(literalQuotes, "\"").concat(value, "\"").concat(literalQuotes) :
Strings_1.Strings.Empty;
}
str += line + '\r\n';
}
return str.trim();
};
return Csv;
}());
exports.Csv = Csv;
//# sourceMappingURL=Csv.js.map