Проверка CSV-файла на соответствие XSD в Javascript

Команда, Мне нужна функция 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;
      }

Ваш код ни в коем случае не проверяет содержимое, он просто читает и предупреждает/отображает их (если все идет правильно). В нынешнем виде это все равно, что сидеть в выключенной машине и в то же время спрашивать, почему она никуда не едет.

Davi 25.06.2024 08:50

Дэви, в настоящее время в моем коде нет проверки. Но код должен перейти в блок catch, когда он обнаруживает несоответствие запятой и пробела справа. Этого не происходит.

Balaganesh Mohanavel 25.06.2024 15:08

Как, по вашему мнению, ваш JS узнает, что в CSV отсутствует значение (и, по вашему мнению, должна быть выдана ошибка), если вы его не проверяете? Тем не менее, блок try/catch не будет волшебным образом обнаруживать ошибки в вашем CSV — он будет обнаруживать ошибки в вашем JS, поэтому вы должны проверить CSV, а затем самостоятельно выдать ошибку. Кроме того, вы читаете CSV асинхронно, поэтому вы никогда не сможете определить, правильно ли возвращаемое значение, поскольку вы устанавливаете его синхронно. Вам нужно решение на основе Promise.

Davi 26.06.2024 09:25

Могу ли я получить решение или справочные ссылки на такой случай, когда мы можем проверить CSV-файл на соответствие любой схеме?

Balaganesh Mohanavel 26.06.2024 12:09

1): Если вы хотите, чтобы другие предоставили вам готовое решение, вам обычно придется за него заплатить — дело не в том, что SO требует от нас раздавать решения бесплатно только потому, что вы этого требуете. 2): Вы уже используете пакет NPM, который содержит пример загрузки и проверки CSV-файла на соответствие схеме непосредственно в его README Github, поэтому похоже, что вы просто отказываетесь его читать.

Davi 27.06.2024 09:39

DAV Я читал это раньше, но оно требует установки. Нужно проанализировать, можно ли его установить в мое облако OIC. Следовательно, ожидается условие проверки, определенное внутри самой функции. Любая ссылка будет полезна

Balaganesh Mohanavel 28.06.2024 09:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хотя кажется, что во втором примере вы немного сдвинули цель (где находится 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
  );
}

Какой из них вы предпочитаете, зависит от вас.

Другие вопросы по теме