У меня возникла проблема с импортом плоского файла в 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
но их проблема не в нем, поскольку у них есть реплицируемое значение столбца, а мне нужна целая новая строка.
Спасибо за любую помощь, сс
!! ИЗМЕНИТЬ, используя ответы 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 #, поэтому для меня все в новинку. Насколько я понимаю код, он ищет каждую строку, чтобы найти шаблон, в котором числа перед одним ";" в конце, поэтому он не найдет те строки, которые заканчиваются числами, следующими за ";;" (два ;). Когда есть совпадение, один ";" добавлен.
Пожалуйста, дайте мне знать, что я не понимаю и делаю неправильно.
Возможно, также неправильно ставить компонент скрипта после исходного плоского файла, потому что добавление ";" не приведет к новой строке, чего я хочу.