Очередной парсинг в Powershell
Давно так не ругался. А ведь после всех мытарств с никсами к неочевидностям должен был выработаться некий резист. Нифига, есть еще куда расти.
Суть такова. Есть файл с данными следующей структуры:
Иванов
Иван
Иваныч
+7 (999) 9998822 i.ivanov@roga-i-kopyta.ru Главный
бухгалтер
Петров
Петр
Петрович
+7 (999) 9997766 p.petrov@roga-i-kopyta.ru Главный
инженер
Сидоров
Сидор
Сидорович
+7 (999) 8887766 s.sidorov@roga-i-kopyta.ru Главный
специалист
Да, структура именно такая, с кривыми должностями, разбитыми по разным строкам ФИО... И из этого добра нужно было получить вполне приличное:
ФИО,email
Как быть? В принципе, алгоритм прост - цепляем строку, где есть электропочта, закидываем эту почту в массив в поле email, затем отсчитываем от этой строки три вверх и из них составляем ФИО, которое закидываем в тот же массив в поле FIO. Ну и повторяем это до тех пор, пока будут перебраны все строки с электропочтой.
Для этой задачи в Powershell есть всё - и match для вычленения электронного адреса, и select-string, при помощи которого можно получить номер интересующей строки. Но не обошлось без странностей. Прекрасно известно, практически все функции, работающие с какими-либо коллекциями, нумеруют элементы этих коллекций начиная с нуля. Каково же было мое удивление, когда после отлова багов я узнал, что тот самый select-string ведет себя по-другому - в его выводе нумерация начинается с единицы, а не нуля. Именно поэтому при составлении полного ФИО Приходится отсчитывать не три строки вверх, а четыре.
Ну и собственно, решение исходной задачи: