aux-dbf
Version:
DBF for price PSM
150 lines • 7.05 kB
JavaScript
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
var DBFReader_1 = require("./DBFReader");
var DBF_MODE_1 = require("./DBF_MODE");
var LanguageDBF7_1 = require("./LanguageDBF7");
var Column_1 = require("./Column");
var iconv = require("iconv-lite");
var DBF7Reader = /** @class */ (function (_super) {
__extends(DBF7Reader, _super);
function DBF7Reader() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.sizeFieldDescriptior = 68;
_this.sizeHeadLength = 48;
return _this;
}
DBF7Reader.prototype.readHeader = function () {
this.TypeTable = this.file.readInt8(0);
this.DateHeaderY = this.file.readInt8(1) - 100 + 2000;
this.DateHeaderM = this.file.readInt8(2);
this.DateHeaderD = this.file.readInt8(3) % 31;
this.RecordsCount = this.file.readInt32LE(4);
this.HeaderSize = this.file.readInt16LE(8);
this.RecordSize = this.file.readInt16LE(10);
this.Encode = this.file
.subarray(32, 63)
.filter(function (r) { return r != 0; })
.toString();
// -1 - это байт окончания заголовка
this.ColumnCount =
(this.HeaderSize - this.sizeFieldDescriptior - 1) / this.sizeHeadLength;
if (this.mode == DBF_MODE_1.DBF_MODE.TEST) {
this.printHeader();
}
};
DBF7Reader.prototype.readSignature = function () {
var _this = this;
this.columns = Array(this.ColumnCount)
.fill(new Column_1.Column())
.map(function (_) { return new Column_1.Column(); })
.map(function (column, index) {
var offset = index * _this.sizeHeadLength + _this.sizeFieldDescriptior;
var name = _this.file
.subarray(offset, offset + 31)
.filter(function (r) { return r != 0; })
.toString();
var type = _this.readChar(offset + 32);
var size = _this.file.readUInt8(offset + 33);
var decimalPlaces = _this.file.readUInt8(offset + 34);
var isMDX = _this.file.readUInt8(offset + 37).toString() != "0";
column.Add(name, size, type, index, decimalPlaces, isMDX);
return column;
});
if (this.mode == DBF_MODE_1.DBF_MODE.TEST) {
this.printColumns();
}
};
DBF7Reader.prototype.printHeader = function () {
var _this = this;
_super.prototype.printHeader.call(this);
var lan = LanguageDBF7_1.LanguageDBF7.find(function (r) {
return r.innerName == _this.Encode;
});
if (!lan)
return console.log("[X] Driver language is not Defined");
console.log("[*] Driver language: '" + this.Encode + "' " + lan.fullName + " | " + lan.voc);
console.log("");
};
DBF7Reader.prototype.readTable = function () {
var _this = this;
console.time("READ DATA SOURCE");
var array = new Array(this.RecordsCount).fill(new Array(this.ColumnCount).fill(null)).map(function (r) {
return new Array(_this.ColumnCount);
});
var startPosition = this.HeaderSize;
var offsetLeft = 0;
for (var column = 0; column < this.ColumnCount; column++) {
var position = startPosition + 1;
if (this.columns[column].getType() == Column_1.COLUMN_TYPE.DOUBLE) {
for (var row = 0; row < this.RecordsCount; row++) {
array[row][column] = this.readIEEE754(this.file.subarray(position + offsetLeft, position + offsetLeft + 8));
position += this.RecordSize;
}
}
else if (this.columns[column].getType() == Column_1.COLUMN_TYPE.CHARACTER) {
var size = this.columns[column].getSize();
for (var row = 0; row < this.RecordsCount; row++) {
// TODO
array[row][column] =
//iconv.decode(
this.file.subarray(position + offsetLeft, position + offsetLeft + size);
//, "win1251"
//).trim();
// array[row][column] =this.file.subarray(position + offsetLeft, position + offsetLeft + size);
position += this.RecordSize;
}
}
else if (this.columns[column].getType() == Column_1.COLUMN_TYPE.INTEGER) {
for (var row = 0; row < this.RecordsCount; row++) {
array[row][column] = this.file.readUInt32BE(position + offsetLeft) & (~0x80000000);
position += this.RecordSize;
}
}
else if (this.columns[column].getType() == Column_1.COLUMN_TYPE.LOGICAL) {
for (var row = 0; row < this.RecordsCount; row++) {
var logicalValue = this.file.readUInt8(position + offsetLeft);
array[row][column] = (logicalValue == 1 || logicalValue == 0x54 || logicalValue == 0x74 || logicalValue == 0x59 || logicalValue == 0x79);
position += this.RecordSize;
}
}
else if (this.columns[column].getType() == Column_1.COLUMN_TYPE.DATE) {
for (var row = 0; row < this.RecordsCount; row++) {
array[row][column] = this.readDate(this.file.subarray(position + offsetLeft, position + offsetLeft + 8));
var p = position + offsetLeft;
position += this.RecordSize;
}
}
else {
throw new Error("[X] Непредсказуемый тип колонки");
}
offsetLeft += this.columns[column].getSize();
}
console.timeEnd("READ DATA SOURCE");
return array;
};
DBF7Reader.prototype.readDate = function (buffer) {
return buffer.toString("ascii", 0, 4) + "-" + buffer.toString("ascii", 4, 6) + "-" + buffer.toString("ascii", 6, 8);
};
DBF7Reader.prototype.readIEEE754 = function (buffer) {
return -buffer.readDoubleBE(0);
};
DBF7Reader.prototype.t8 = function (position) {
return this.file.readUInt8(position).toString(16).padStart(2, "0");
};
return DBF7Reader;
}(DBFReader_1.DBFReader));
exports.DBF7Reader = DBF7Reader;
//# sourceMappingURL=DBF7Reader.js.map