Поиск RegEx возвращает -1, хотя фраза определенно присутствует в массиве - PullRequest
2 голосов
/ 17 января 2020

Я импортирую файл Excel, используя xlsx в angular, где файл Excel импортируется как объект массивов, причем каждый массив является строкой файла Excel, а каждый элемент в каждом массиве является ячейкой внутри это соответствующий ряд. Ниже описано, как это сделать

onFileChange(event: any) 
  {
    const inputFile: DataTransfer = <DataTransfer>(event.target); 
    const fileReader: FileReader = new FileReader();
    fileReader.onload = (event: any) => 
    {
      const binaryString: string = event.target.result;
      const workBook: XLSX.WorkBook = XLSX.read(binaryString, { type: 'binary', sheetStubs: true}); 
      /* sheetstubs true supposedly shows empty cells but isn't */

      const workSheetName: string = workBook.SheetNames[0];
      const workSheet: XLSX.WorkSheet = workBook.Sheets[workSheetName];

      this.data = <Array>(XLSX.utils.sheet_to_json(workSheet, 
      {header: 1, blankrows: true }));


    };

Я сейчас пытаюсь найти столбец, содержащий описание производителя, с помощью поиска Regex, просматривая каждый массив и ища термин cap как поэтому:

getManufacturerDescriptionColumn()
  {
    console.log(this.data)
    for (const row in this.data)
    {

      var manDescriptIndex = row.search(/cap/i)
      console.log(manDescriptIndex)
      if (manDescriptIndex > -1) 
      {
       return manDescriptIndex
      }
    }
  }

однако, когда бы я ни пытался это сделать, даже при том, что в некоторых массивах при запуске этого файла явно присутствует ограничение фразы, мне предоставляются все значения -1, указывающие, что фраза не найден ни в одном из массивов. Ниже приведен прикрепленный пример, где CAP явно присутствует в паре из 15 строк файла Excel, но я все еще встречаюсь со значениями 15 -1.

Example Manufacturer Description Column

Например, массив, индексированный по Любой идеи, почему поиск по регулярному выражению не идентифицирует фразу в этом сценарии, когда я делаю console.log(this.data) Я могу видеть фразу cap следующим образом:

Array #13 in object of arrays

Я также попытался добавить еще один слой итерации, чтобы также изолировать строки отдельных ячеек в строке, но безрезультатно.

Ответы [ 2 ]

2 голосов
/ 17 января 2020

Как вы можете ясно прочитать здесь MDN , вы используете l oop for..in, что является ошибкой, и вы должны использовать for..of вместо этого. Объяснение ниже

for..in сделано для итерации вокруг объектов, что на самом деле работает для массивов, но просто дает вам индексы, которые в этом случае будут 0,1,2 и так далее ...

Если вы хотите получить значения, вы должны будете использовать for..of l oop MDN

Это будет видно более отчетливо, если вы напечатаете console.log(row) до проверки

0 голосов
/ 18 января 2020

Хорошо, @AlejandroVales определенно был прав в своем ответе, поэтому я не собираюсь снимать этот заслуженный флажок, но ... У меня есть обновление, чтобы полностью получить решение, потому что при изменении in на of было это помогло мне добраться до того, что мне нужно было достичь, было еще многое сделать, и в духе обмена информацией и откровенно хорошей кармы у меня есть для других, кто сталкивается с подобной проблемой ... решение. Вместо того, чтобы пытаться использовать методы массива, чтобы посмотреть, смогу ли я найти то, что я ищу, я проверил каждый элемент в каждом массиве ПРОТИВ регулярного выражения, АКА. Я немного перевернул проблему с головы. Чтобы уточнить, взгляните на приведенный ниже блок кода

var cap = new RegExp(/cap/i)
    for (const row of this.data)
    {
      for (let cell = 0; cell<row.length; cell++)
      {
        if (cap.test(row[cell]))
        {
          return cell
        }
      }
    }

Сначала установите переменную, равную регулярному выражению, а затем перейдите к уровню, на котором я перебираю каждую ячейку в каждом массиве (каждый массив представляет собой строку документа Excel в этом случае), затем найдите ячейку, которая возвращает ИСТИННОЕ значение, и проблема poof решена. Если я не очень хорошо объяснил это решение, не стесняйтесь оставлять комментарии ниже, я не эксперт, но решил, что это правильно, постараюсь сделать все возможное, чтобы оценить сообщество, которое ранее придало мне такую ​​большую ценность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...