Создайте Истинный Счет, чтобы выбрать наиболее вероятный столбец - PullRequest
0 голосов
/ 09 февраля 2020

Я импортирую данные из файла Excel и пытаюсь найти определенную информацию из соответствующих столбцов, используя RegEx для поиска столбцов, содержащих данные, которые я ищу. Однако регулярное выражение является несовершенным, поскольку иногда выражения находятся в нескольких столбцах. Поэтому, чтобы учесть это, я хочу создать какой-то внутренний счетчик, который будет подсчитывать количество раз, когда столбец имеет одно из регулярных выражений, которые я определил в наборе. Пример этого может быть найден ниже.

columnsWithDescription()
  {
    var refDesRegex = [/resistor/i,/capacitor/i,/res/i,/cap/i]

    var refDesColumnNumber = new Set();
    for (var expression of refDesRegex)
    {
      for (const row of this.data)
      {
        for (var cell = 0; cell<row.length; cell++)
        {
          if (expression.test(row[cell]))
          {
            refDesColumnNumber.add(cell)
          }
        }
      }
    }

data - лист Excel, который был импортирован. Это массив массивов, где каждый массив является строкой таблицы Excel.

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

1 Ответ

1 голос
/ 09 февраля 2020

То, что я пытался сказать: если вам интересно узнать, какой столбец таблицы имел наибольшее совпадение с любым из регулярных выражений, то:

  1. Вам не нужно проверить каждое регулярное выражение отдельно. Вы можете проверить по одному регулярному выражению, которое является «логическим или» из отдельных регулярных выражений.
  2. Вам просто нужно вести подсчет для каждого номера столбца, сколько раз этот столбец совпадал с регулярным выражением ( в словаре).

Наконец, вам необходимо отсортировать ключи и значения этого словаря на основе значений, а затем ключ, связанный с максимальным значением, является результатом, который вы ищете.

columnsWithDescription()
{
  let regex = /(resistor|capacitor|res|cap)/i;
  let counts = {}; // dictionary of counts
  for (let row of this.data)
  {
    for (var cell = 0; cell < row.length; cell++)
    {
      if (regex.test(row[cell]))
      {
        // we have a match in column # cell
        if (cell in counts)
          counts[cell]++; // not the first time we've had a match in this column
        else
          counts[cell] = 1;
      }
    }
  }

  /* the keys of the counts dictionary are the column numbers
     and the values are the number of times a match was found in that column
  */
  // sort the counts dictionary:
  // create the items array
  let items = Object.keys(counts).map(function(key) {
    return [parseInt(key), counts[key]]; // the keys are actually strings
  });
  // sort items array in descending order based on the values:
  items.sort(function(first, second) {
    return second[1] - first[1];
  });
  return items[0][0]; // this is the column number that had the most matches
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...