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", там решается ситуация, когда в одной строке несколько телефонов.