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

У меня возникла проблема с импортом плоского файла в SSIS.

Файл разделен знаком "|" и разделитель обозначен как ";;". Однако делиминатор непоследователен. Иногда в строках и есть только ";" или ничего "". При импорте в SSIS я получаю результат

Column 1 Column 2 Column 3 Column 4 Column 5 
a         b        c        d        e;|a1|b1|c1|d1|e1

Вместо этого это должно выглядеть так

Column 1 Column 2 Column 3 Column 4 Column 5 
a         b        c        d        e
a1        b1       c1       d1       e1

И проблема возникает из-за того, что в первой строке только один или нет ни одного символа ";". Обратите внимание, что это пример, многие строки правильные и имеют ";;" как разделитель. Я только указываю на проблему.

Файл .csv будет выглядеть так:

Column 1|Column 2|Column 3|Column 4|Column 5;; 
a|b|c|d|e;
a1|b1|c1|d1|e1;;

и вместо этого должен выглядеть

Column 1|Column 2|Column 3|Column 4|Column 5;; 
a|b|c|d|e;;
a1|b1|c1|d1|e1;;

Набор данных очень большой, почти 600 000 строк и 50 столбцов.

Первая проблема, с которой я сталкиваюсь, - это когда я импортирую файл, поскольку стандартное чтение типа данных SSIS - string [DT_STR]. длиной 50. Поскольку иногда есть несколько строк с неправильными разделителями, я получаю очень длинные строки в последней ячейке столбца. Я использую Visual Studio, и в расширенном редакторе я изменил длину на что-то очень большое.

Расширенный редактор в Visual Studio, где я изменил длину

Итак, вопрос в том, как мне в SSIS и Visual Studio Community разделить значения в некоторых ячейках в одном столбце и разделить их на целую новую строку (с уже определенными переменными столбца).

Я попытался вручную найти все случаи, когда есть ошибка, и изменил это в файле .csv. После этого SSIS работает. Однако это не надежное решение, потому что я получаю новый файл каждый месяц.

Я пробовал читать предложения как:

Разделить один столбец данных с разделителями-запятыми в несколько столбцов в SSIS

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/49a764e7-1a6f-4a6f-9c92-2462ffa3add2/regarding-ssis-split-multi-value-column-into-multiple-records?forum=sqlintegrationservices

но их проблема не в нем, поскольку у них есть реплицируемое значение столбца, а мне нужна целая новая строка.

Спасибо за любую помощь, сс

!! ИЗМЕНИТЬ, используя ответы J Weezy и R M: !!

Я пытаюсь создать задачу-сценарий и следую этому решению.

В Visual Studio я добавляю задачу сценария с помощью компонента сценария и выбираю «Преобразование». В столбцах ввода я выбираю все.

После этого я направляю источник плоского файла в компонент сценария и запускаю код. Запуск такого сценария (где компонент сценария ничего не делает) работает.

В компоненте скрипта нет скрипта

Затем я ввожу «Редактировать скрипт» в компонент скрипта и в поле public override void Input0_ProcessInputRow(Input0Buffer Row) ввожу (с помощью R M):

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    public static string[] SplitLine(string input)
    {
        Regex lineSplit = new Regex("[0-9]\;$", RegexOptions.Compiled);
        List<string> list = new List<string>();
        string curr = null;
        foreach (Match match in lineSplit.Matches(input))
        {
            curr = match.Value;
            if (0 == curr.Length)
            {
                list.Add("");
            }

            list.Add(curr.TrimStart(';'));
        }

        return list.ToArray();
    }
}

Однако это не работает (мне даже не разрешено выполнять задачу).

Я никогда раньше не работал с C #, поэтому для меня все в новинку. Насколько я понимаю код, он ищет каждую строку, чтобы найти шаблон, в котором числа перед одним ";" в конце, поэтому он не найдет те строки, которые заканчиваются числами, следующими за ";;" (два ;). Когда есть совпадение, один ";" добавлен.

Пожалуйста, дайте мне знать, что я не понимаю и делаю неправильно.

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


person sss    schedule 19.07.2018    source источник


Ответы (2)


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

  1. Обратитесь к поставщику источника данных, чтобы решить проблему с его стороны.
  2. Создайте задачу сценария, чтобы сначала изменить файл, чтобы исправить неверные данные

Оттуда вы сможете нормально обрабатывать файл в SSIS.

Обновление 1:

Если единственная проблема - повторяющийся разделитель (;;), прочитайте строку и используйте функцию Replace(";;",";");. Если у вас несколько повторяющихся или недопустимых разделителей конца строки, вам лучше использовать StringBuilder(). Решение по использованию StringBuilder() см. По ссылке ниже.

https://stackoverflow.com/a/49949787/4630376

Обновление 2:

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

person J Weezy    schedule 19.07.2018
comment
Спасибо за ответ. Я попытался создать задачу сценария, но мне это не удалось. Я обновил вопрос, и у меня есть какие-либо комментарии, дайте мне знать. - person sss; 20.07.2018

Я согласен с J Weezy создать задачу сценария для исправления неверных данных. В задаче сценария вы могли бы использовать регулярное выражение для работы с «;» и ";;" проблема. Задача сценария может быть вашим единственным способом справиться с символом «;» и ";;" проблема.

Хотя приведенный ниже код в его текущей форме не будет работать в вашем случае, его, возможно, можно изменить, чтобы он работал в вашем случае. Я использовал его для обработки текстового файла \ csv, чтобы исправить проблемы с форматированием каждой строки данных. Обратите внимание, я получил это из другого сообщения на Stackoverflow.

    public static string[] SplitLine(string input)
    {
        Regex lineSplit = new Regex("(?:^|,)(\"(?:[^\"]+|\"\")*\"|[^,]*)", RegexOptions.Compiled);
        List<string> list = new List<string>();
        string curr = null;
        foreach (Match match in lineSplit.Matches(input))
        {
            curr = match.Value;
            if (0 == curr.Length)
            {
                list.Add("");
            }

            list.Add(curr.TrimStart(','));
        }

        return list.ToArray();
    }
person R M    schedule 19.07.2018
comment
Спасибо за ответ. Я попытался создать задачу сценария, но мне это не удалось. Я обновил вопрос, и у меня есть какие-либо комментарии, дайте мне знать. - person sss; 20.07.2018