Плоский файл служб SSIS со значениями, содержащими текстовый квалификатор - PullRequest
2 голосов
/ 24 мая 2019

Я получил плоский файл, который не может быть создан другим способом.Разделитель - это запятая, а квалификатор текста - двойная кавычка.Проблема в том, что иногда в значении есть двойная кавычка.Например:

"0","12345", "Centre d"edu et de recherche", "B8E7"

Из-за двойной кавычки в значении я получил эту ошибку:

[Источник плоского файла [58]] Ошибка: Разделитель столбцов для столбца«XYZ» не был найден.

[Источник плоского файла [58]] Ошибка: ошибка при обработке файла «C: \ somefile.csv» в строке данных 296.

Что я могу сделать для обработки этого файла?

Я использую SSIS 2016 с Visual Studio 2015

1 Ответ

1 голос
/ 25 мая 2019

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

В Интернете много ссылок, чтобы узнать больше об источнике плоских файловВывод ошибки:


Обновление 1 - Временное решение с использованием компонента сценария и условного разбиения

сВывод ошибки плоского файла не работает, вы можете использовать компонент сценария с условным разбиением для фильтрации плохих строк. Следующее обновление является пошаговым руководством для реализации этого:

  1. Добавление диспетчера соединений с плоскими файлами, Перейдите на вкладку «Дополнительно», удалите все столбцы, кроме одного, и измените его длину на 4000

enter image description here

Добавьте компонент сценария, перейдите на вкладку «Входные и выходные столбцы», добавьте нужные выходные столбцы (в этом примере 4 столбца) и добавьте столбец флага типа DT_BOOL Внутри компонента сценария напишите следующеескрипт для проверки, если число столбцов равно 4, тогда Flag = True, что означает, что это допустимая строка, иначе установите Flag как False, что означает, что это неверная строка:
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {

        if (!Row.Column0_IsNull && !String.IsNullOrWhiteSpace(Row.Column0))
        {

            string[] cells = Row.Column0.Split(new string[] { "\",\"" }, StringSplitOptions.None);


            if (cells.Length == 4)
            {

                Row.Col1 = cells[0].TrimStart('\"');
                Row.Col2 = cells[1];
                Row.Col3 = cells[2];
                Row.Col4 = cells[3].TrimEnd('\"');
                Row.Flag = true;
            }
            else
            {
                bool cancel;
                Row.Flag = false;
            }

        }
        else
        {

            Row.Col1_IsNull = true;
            Row.Col2_IsNull = true;
            Row.Col3_IsNull = true;
            Row.Col4_IsNull = true;
            Row.Flag = true;
        }

    }

}
Добавить условное разбиение для разделения строк на основе Flag столбец

enter image description here

Сопоставьте вывод действительных рядов с назначением OLEDB, а вывод плохих рядов - с другим плоским файлом, в котором отображается только Column0

enter image description here

...