Сортировка списка электронных компонентов? - PullRequest
1 голос
/ 23 октября 2019

В электронной таблице материалов электронных компонентов перечислены компоненты по их значениям, например, 1R0 (для 1 Ом), 1K0 (для 1 килоОм) или 22p (для 22 пико-Фарад), 1n0(за 1 нанофарад). Как можно отсортировать числа в этом формате в числовом порядке?

Ранее, без сортировки:

Резисторы

  • 1K0
  • 1R0

Конденсаторы

  • 1n0
  • 22p

После, отсортировано:

Резисторы

  • 1R0
  • 1K0

Конденсаторы

  • 22p
  • 1n0

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Вы можете использовать следующую пользовательскую функцию для сортировки ваших значений:

var unitMap = {
  'p': 1e-12,
  'n': 1e-9,
  'u': 1e-6,
  'm': 1e-3,
  'R': 1,
  'K': 1e3,
  'M': 1e6,
}

var unitRegex = /[pnumRKM]/;

function parseValue(val) {
  var result = {};
  var unitIdx = val.search(unitRegex);
  var int = parseInt(val.substring(0, unitIdx));
  var dec = parseFloat("0." + val.substring(unitIdx+1));
  var multiplier = unitMap[val[unitIdx]];
  return (int + dec) * multiplier;
}

/**
 * Sorts E96 values.
 *
 * @param {range} input The range to sort.
 * @param {number} input The column to sort by, starting at 1.
 * @param {boolean} input Is ascending
 * @return Sorted range.
 * @customfunction
 */
function CUSTOMSORT(values, sort_column, is_ascending) {
  values.sort(function (a, b) {
    var a_value = parseValue(a[sort_column-1]);
    var b_value = parseValue(b[sort_column-1]);
    return is_ascending ? a_value - b_value : b_value - a_value;
  });

  return values;
}

Поведение почти такое же, как вы ожидаете от встроенного в Sheets. =SORT() функция, хотя и с меньшим количеством функций. Ниже вы можете увидеть два примера:

CUSTOMSORT resistors

CUSTOMSORT capacitors

1 голос
/ 23 октября 2019

вы можете выполнить пользовательскую сортировку следующим образом, определяя порядок сортировки каждого скаляра:

=ARRAYFORMULA(SUBSTITUTE(TRANSPOSE(QUERY(TRANSPOSE(IFERROR(
 ARRAY_CONSTRAIN(SORT({REGEXEXTRACT(A2:A, "(\d+)(.*)"), 
               VLOOKUP(REGEXEXTRACT(A2:A, "\d+(.*)"), 
 {"R0", 1; 
  "K0", 2; 
  "M0", 3}, 2, 0)}, 3, 1, 1, 1), 999^99, 2))),,999^99)), " ", ))

0

...