Разделение записей из плоского файла с разделителями каналов с использованием служб SSIS - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть плоский файл с разделителями труб, содержащий около 25 000 строк, но в некоторых строках есть пробелы, в то время как в других есть несколько вхождений заголовка и подзаголовка.Я хотел бы сохранить только одну строку заголовка и опустить все остальные строки заголовков, строки подзаголовков и строки с пробелами.Для этого я использовал скрипт C # в конце этого поста, используя StreamReader и StreamWriter, но хотя скрипт работал нормально, его запуск занял более 9 часов.Недавно я начал использовать SSIS, а теперь смотрю на использование преобразования SSIS с условным разделением.

Мои данные выглядят примерно так:

*[white space]* Business Unit: 099 - HAA/DEPT OF SSSSSS SSSSSSSS
*[white space]* Empl Id  |  Employee Name  |  Dept Id  |  Department  |  EE Home Phone  |  Emergency Contact Name  |  Primary  |  Telephone  |  Relationship 
*[white space]*  0144111 | Adams Cdddddddd | 0990101 | Executive/Director-NM | *********** | *****NO CONTACT***** |  |  |   1555444 | Bookk Derkkk Yeeee | 0990101 | Director/Manager-NM |
*********** | AAALL SELLELL | Y | 646/711-9999| Parent 1555444 | Bookk Derkkk Yeeee | 0990101 | Director/Manager-NM | *********** | YYYXXX DeVaaa | N | 212/344-2222| Oth Relat 1555444 | Bookk Derkkk Yeeee | 0990101 | Director/Manager-NM | *********** | SSLL Wildddd | N | 917/255-5555| Oth Relat 1555444 | Bookk Derkkk Yeeee | 0990101 | Director/Manager-NM | *********** | CCLL A. Sree | N | 917/666-3333| Friend
*[white space]*  Business Unit: 099 - HAA/DEPT OF SSSSSS SSSSSSSS
*[white space]* Empl Id  |  Employee Name  |  Dept Id  |  Department  |  EE Home Phone  |  Emergency Contact Name  |  Primary  |  Telephone  |  Relationship 
*[white space]*  0144111 | Adams Cdddddddd | 0990101 | Executive/Director-NM | *********** | *****NO CONTACT***** |  |  |   1555444 | Bookk Derkkk Yeeee | 0990101 | Director/Manager-NM |
*********** | AAALL SELLELL | Y | 646/711-9999| Parent 1555444 | Bookk Derkkk Yeeee | 0990101 | Director/Manager-NM | *********** | YYYXXX DeVaaa | N | 212/344-2222| Oth Relat 1555444 | Bookk Derkkk Yeeee | 0990101 | Director/Manager-NM | *********** | SSLL Wildddd | N | 917/255-5555| Oth Relat 1555444 | Bookk Derkkk Yeeee | 0990101 | Director/Manager-NM | *********** | CCLL A. Sree | N | 917/666-3333| Friend

Поток данных служб SSIS содержит следующее: 1) Источник плоских файлов с данными, аналогичными показанным выше.Есть 9 столбцов.2) Условное разделение со следующими критериями, которые разделяются на Multicast, Multicast1 и Multicast2:

i) RowsToOmit LTRIM (RTRIM ([Empl Id])) == "" ii) SecondTextToOmit LTRIM (RTRIM ([EmplId])) == "Бизнес-единица: 099 - HAA / DEPT OF SSSSSS SSSSSSSS"

iii) Хорошие строки: GoodRows.В конечном счете, я также хочу опустить все другие вхождения следующего заголовка, но сохранить только первое вхождение этого: «Empl Id | Имя сотрудника | Dept Id | Отдел | EE Домашний телефон | Имя экстренного контактного лица | Основной | Телефон | Отношения»

Я подготовил пакет служб SSIS, но при его запуске я получил следующие ошибки:

Ошибка: 0xC02020A1 при преобразовании с условным разделением HAA, источник плоского файла [1]: преобразование данныхне удалось.Преобразование данных для столбца «Empl Id» вернуло значение состояния 4 и текст состояния «Текст был усечен или один или несколько символов не совпадали на целевой кодовой странице».Ошибка: 0xC020902A в HAA Условное преобразование разбиения, источник плоского файла [1]: «выходной столбец« Empl Id »(63)» не выполнен, поскольку произошло усечение, и расположение строки усечения в «выходном столбце« Empl Id »(63)»указывает сбой при усечении.Произошла ошибка усечения указанного объекта указанного компонента.Ошибка: 0xC0202092 в HAA Условное преобразование разбиения, источник плоского файла [1]: Произошла ошибка при обработке файла «Z: \ Экстренный контактный отчет \ TEST \ PER004-069-TEST.txt» в строке данных 251. Ошибка: 0xC0047038 в HAAУсловное преобразование разделения, SSIS. Трубопровод: код ошибки SSIS DTS_E_PRIMEOUTPUTFAILED.Метод PrimeOutput для компонента «Источник плоского файла» (1) возвратил код ошибки 0xC0202092.Компонент возвратил код ошибки, когда механизм конвейера вызвал PrimeOutput ().Значение кода ошибки определяется компонентом, но ошибка является фатальной, и конвейер перестал выполняться.Перед этим могут быть сообщения об ошибках с дополнительной информацией о сбое.

Почему я получаю эту ошибку?В конечном итоге я хочу сохранить только одну строку заголовка и пропустить все остальные строки заголовков, строки подзаголовков и строки с пробелами.Не могли бы вы также помочь мне определить лучший и наиболее эффективный метод для этого?

C # Скрипт:

using (StreamReader sr = new StreamReader(sourcePath))
{
    while ((Line = sr.ReadLine()) != null)
    {  
        // Write 1st occurance of Heading
        if (Line.Trim() == headerText && headerCount == 0)
        {
            outputText = outputText + Line + Environment.NewLine;
            headerCount++;
        }
        else
            //store text in variables to do checks all in same if statement
            if (Line.Trim() != "" && Line.Trim() != headerText && Line != headerText && Line != secondTextToOmit && Line != thirdTextToOmit)
            {
                outputText = outputText + Line + Environment.NewLine;
            }
        using (StreamWriter writer = new StreamWriter(destinationPath))
        {
            //write the string using filtered text
            writer.WriteLine(outputText);
        }
    }
}
...