csv-resolver
Version:
read csv and analyse
123 lines (122 loc) • 3.73 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const unit8ArrayToChar = (array) => {
const len = array.length;
let result = "";
let i = 0;
let char2;
let char3;
while (i < len) {
const c = array[i++];
/* eslint-disable no-bitwise */
switch (c >> 4) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
result += String.fromCharCode(c);
break;
case 12:
case 13:
char2 = array[i++];
result += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f));
break;
case 14:
char2 = array[i++];
char3 = array[i++];
result += String.fromCharCode(((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0)
/* eslint-enable */
);
break;
default:
break;
}
}
return result;
};
class CSVFormatter {
/**
* _csv csv 内容
*/
_csv = "";
/**
* _wordArray 文件中每一个单词的存储, row[column]
*/
_wordArray = [[]];
/**
* _rowNum 当前行数 - 1
*/
_rowNum = 0;
/**
* _subStr 当前读入子字符
*/
_subStr = "";
constructor() { }
async loadFile(file) {
if (!file)
throw new Error("CSVFormatter: file not exist.");
const { value } = await file.stream().getReader().read();
1;
this._csv = unit8ArrayToChar(value);
}
async analyse(validator) {
let result = [];
// 去除空格, 并根据换行符和逗号分隔字符串
for (const str of this._csv) {
if (str === "\n") {
this._wordArray[this._rowNum].push(this._subStr);
this._subStr = "";
this._wordArray.push([]);
this._rowNum += 1;
continue;
}
else {
switch (str.trim()) {
case ",":
this._wordArray[this._rowNum].push(this._subStr);
this._subStr = "";
break;
case "":
break;
default:
this._subStr += str;
break;
}
}
}
// 最后一段数据有可能没有换行符
if (this._subStr) {
this._wordArray[this._rowNum].push(this._subStr);
this._subStr = "";
}
if (this._wordArray[this._rowNum].length === 0) {
this._wordArray.pop();
}
for (let i = 1; i < this._wordArray.length; i++) {
const row = this._wordArray[i];
result.push({});
for (let index = 0; index < row.length; index++) {
const key = this._wordArray[0][index].trim();
const validateRes = await validator(key, row[index], {
row: i + 1,
column: index + 1,
});
if (validateRes) {
// 如果字符串不为空, 有错误信息, 抛出
return Promise.reject(new Error(validateRes));
}
result[i - 1][key] = row[index];
}
}
// 对内容做判断
if (result.length === 0) {
return Promise.reject(new Error("文件为空"));
}
return Promise.resolve(result);
}
}
exports.default = CSVFormatter;