У меня есть плоский файл с разделителями труб, содержащий около 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);
}
}
}