Команда, Мне нужна функция javascript для проверки соответствия CSV-файла определению схемы.
BU_NAME,BU_CONTACT,CONTEXT
US_BU,John,FIN
US_BU,Emily,SCM
,Eric,SCM
UK_BU,Joe,SCM
Приведенный выше входной файл должен выдать ошибку в строке 3, поскольку обязательное BU_NAME пусто. Но приведенный ниже код JS не попал в блок catch. Он всегда возвращает 200, но мне нужно 500, когда возникает проблема с форматом CSV.
resolve(fileSet) {
const validator = require('xsd-schema-validator');
let status = '';
if (fileSet.length > 0) {
//Grab the first (and only) file
let csvFile = fileSet[0];
//Check it's the correct type
try {
if (csvFile.type === 'text/csv') {
alert('CSV FILE');
//Create a File reader and its onload callback
let fileReader = new FileReader();
fileReader.onload = function (fileReadEvent) {
let readCSVData = fileReadEvent.target.result;
alert('result 11===> ' + readCSVData);
// resolve(readCSVData);
};
fileReader.readAsText(csvFile);
status = 200;
}
} catch (error) {
alert('status ===> ' + status+ ' error ==> '+ error);
return status = 500;
}
}
return status;
}
Следующий код работает и проверяет файл, но значение переменной Status не установлено ни на 200, ни на 500 соответственно. По умолчанию всегда используется начальное значение 100. Значение состояния недоступно для возврата корневой функции.
readAndProcess(file) {
let status = 100;
let flag = 0;
let reader = new FileReader();
reader.onload = function (e) {
let rows = e.target.result.split("\n");
for (let i = 1; i < rows.length; i++) {
let cells = rows[i].split(",");
if (cells.length < 2 || cells.length > 13) {
flag = 1;
break;
}
for (let j = 0; j < cells.length; j++) {
if (cells[0] === "" || cells[11] === "" || cells[j] === "\r") {
flag = 1;
break;
}
}
if (flag === 1)
break;
}
if (flag){
window.alert("ERROR");
status = 500;
}
else{
window.alert("VALIDATED");
status = 200;
}
};
reader.readAsText(file);
return status;
}
Дэви, в настоящее время в моем коде нет проверки. Но код должен перейти в блок catch, когда он обнаруживает несоответствие запятой и пробела справа. Этого не происходит.
Как, по вашему мнению, ваш JS узнает, что в CSV отсутствует значение (и, по вашему мнению, должна быть выдана ошибка), если вы его не проверяете? Тем не менее, блок try/catch
не будет волшебным образом обнаруживать ошибки в вашем CSV — он будет обнаруживать ошибки в вашем JS, поэтому вы должны проверить CSV, а затем самостоятельно выдать ошибку. Кроме того, вы читаете CSV асинхронно, поэтому вы никогда не сможете определить, правильно ли возвращаемое значение, поскольку вы устанавливаете его синхронно. Вам нужно решение на основе Promise
.
Могу ли я получить решение или справочные ссылки на такой случай, когда мы можем проверить CSV-файл на соответствие любой схеме?
1): Если вы хотите, чтобы другие предоставили вам готовое решение, вам обычно придется за него заплатить — дело не в том, что SO требует от нас раздавать решения бесплатно только потому, что вы этого требуете. 2): Вы уже используете пакет NPM, который содержит пример загрузки и проверки CSV-файла на соответствие схеме непосредственно в его README Github, поэтому похоже, что вы просто отказываетесь его читать.
DAV Я читал это раньше, но оно требует установки. Нужно проанализировать, можно ли его установить в мое облако OIC. Следовательно, ожидается условие проверки, определенное внутри самой функции. Любая ссылка будет полезна
Хотя кажется, что во втором примере вы немного сдвинули цель (где находится XSD, по которому проверяется CSV?), возможное решение, которое работает в соответствии с вашими правилами проверки, может выглядеть следующим образом:
function splitCSV(csvString) {
// used to split the whole CSV contents into an array of rows,
// each resembled as an array of strings
return csvString
.split(/\\n/g) // split into rows
.slice(1) // get rid of header row
.map(row => row.split(/,/g)); // split each row into it's cells
}
function rowIsValid(row) {
// resembles line 9 from your second example
return row.length >= 2 && row.length <= 13;
}
function cellIsValid(cell) {
// resembles line 16 from your second example
return cell.trim() !== '' && cell !== '\r';
}
function csvIsValid(csvString) {
const rows = splitCSV(csvString); // split into rows of cells
return rows.reduce(
(isValidSoFar, row) => {
if (isValidSoFar) { // if all rows until now are valid...
if (rowIsValid(row)) { // ... and this one is valid ...
return row.every(cellIsValid); // ... see if all cells in the row are valid
}
}
return false;
},
true
);
}
function readAndProcess(file) {
// loading the file and validating it is an asynchronous process,
// therefor we use a promise here
return new Promise((resolve, reject) => {
let reader = new FileReader();
reader.onerror = reject; // handle errors if load fails
reader.onload = function (e) {
if (csvIsValid(e.target.result)) {
resolve(200); // file loaded & valid
} else {
resolve(500); // file loaded, but invalid
}
};
reader.readAsText(file);
});
}
И вы бы использовали его так:
readAndProcess('path/to/csv/file.csv')
.then((statusCode) => {
console.info('CSV loaded, result is:', statusCode);
})
.catch((loadError) => {
console.info('Failed to load the CSV file because:', loadError);
});
Обратите внимание, что csvIsValid
можно записать и в более короткой форме (это более лаконично, но, ИМХО, в целом ее немного сложнее понять):
function csvIsValid(csvString) {
const rows = splitCSV(csvString);
return rows.reduce(
(isValidSoFar, row) =>
isValidSoFar && rowIsValid(row) && row.every(cellIsValid),
true
);
}
Какой из них вы предпочитаете, зависит от вас.
Ваш код ни в коем случае не проверяет содержимое, он просто читает и предупреждает/отображает их (если все идет правильно). В нынешнем виде это все равно, что сидеть в выключенной машине и в то же время спрашивать, почему она никуда не едет.