SSIS - приведение телефонов в порядок
Есть файл или база с "кривыми телефонами". Требуется получить все в определенном формате. Моё решение на SSIS.
Вставляем Script Component, в котором обрабатываем на C# таким образом:
...
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Text;
...
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
if (!Row.PhonesIn_IsNull)
{
var countryPref = "7"; // we assume, that all phones are domestic and harcode country code
var defaultCityPref = "495"; // default city or operator prefix
var phones = Row.PhonesIn.Split(','); // phones in string should be separated with commas
var e = phones.GetEnumerator();
var p = new System.Text.StringBuilder();
while (e.MoveNext())
{
var phone = e.Current.ToString().Trim();
var r1 = new Regex(@"(.*)(\d).*(\d).*(\d).*(\d).*(\d).*(\d).*(\d)\D*$", RegexOptions.IgnoreCase); // expression to match phone number
var r2 = new Regex(@".*(\d{3})\D*$", RegexOptions.IgnoreCase); // expression to match city or operator prefix
var m = r1.Match(phone);
if (m.Success)
{
var pref = r2.Match(m.Groups[1].Value).Groups[1].ToString(); // get prefix out
pref = (pref.Equals("095")) ? "495" : pref; // replace old Moscow prefix with new
if (pref.Length == 0) pref = defaultCityPref;
p.Append(
((p.Length>0)?", ":"") + // phones to be separated with commas in ouput string also
"+" + countryPref + // phones prefixed with '+' and country code
"(" + pref + ")" + // city or operator prefix taken in curves
m.Groups[2].Value +
m.Groups[3].Value +
m.Groups[4].Value + "-" +
m.Groups[5].Value +
m.Groups[6].Value + "-" +
m.Groups[7].Value +
m.Groups[8].Value);
}
}
Row.PhonesOut = p.ToString();
}
}
Ищем номера с последней цифры. Особенность телефонных номеров в том, что последние 7 цифр (если Москва) будут в правильном порядке (как бы они не были разделены). И даже если после цифр будет написано "Юля" или "Роман", последние 7 цифр — номер телефона. Поэтому, сначала ищём 7 цифр с конца строки.
Второе выражение на вычисление префикса (кода города или оператора связи). Особенность кода в том, что там всегда 3 цифры вместе, их никогда не разделяют. Не важно в скобках они или в пробелах. Поэтому 3 подряд идущих цифры в первой части номера это код.
В общем, довольно простая логика и дает очень много совпадений.
Смотрите также "SSIS - приведение телефонов в порядок #2", там решается ситуация, когда в одной строке несколько телефонов.