Использование AddRow () в выходном буфере, когда преобразование C# в SSIS требует синхронности? - PullRequest
1 голос
/ 20 апреля 2020

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

Например, Input0Buffer имеет один столбец. Фактическим данным всегда предшествует строка, начинающаяся с фразы «STARTDATA», и заключенная в скобки строкой, начинающейся с «ENDDATA».

Один входной столбец содержит 5 бит данных, разделенных | , Два из этих столбцов меня не волнуют.

В основном входной файл выглядит следующим образом:

junkrow

headerstuff

morejunk

STARTDATA

ID1 | мусор | вещи | яблоко | сыр

ID2 | барсук | барахло | груша | йогурт

До сих пор я пытался получить несколько строк -row logi c в преобразователе C#, который, я думаю, меня устраивает - но я не могу понять, как заставить его выводить мои разделенные данные. Код ниже.

bool passedSOD;
bool passedEOD;

public void ProcessRow(Input0Buffer data)      
{

string Col1, Col2, Col3;

if (data.Column0.StartsWith("ENDDATA")) 
{
passedEOD = true;
}

if (passedSOD && !passedEOD)
{
var SplitData = data.Column0.Split('|');

Col1 = SplitData[0];
Col2 = SplitData[3];
Col3 = SplitData[4];

//error about Output0Buffer not existing in context
Output0Buffer.Addrow();
Output0Buffer.prodid = Col1;
Output0Buffer.fruit = Col2;
Output0Buffer.dairy = Col3;
}

if (data.Column0.StartsWith("STARTDATA"))
{
passedSOD = true; 
} 
}

Если я изменяю вывод на асинхронный, он останавливает ошибку о том, что Output0Buffer не существует в текущем контексте, и запускается, но выдает мне выходные данные в 0 строк - предположительно, потому что мне это нужно для быть синхронным, чтобы работать через каждую строку, как я настроил это?

Любая помощь очень ценится.

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Вы можете сократить свой код, просто проверив, содержит ли строка '|'

if(Row.Column0.Contains("|")
{
     string[] cols = Row.Column0.Split('|');

     Output0Buffer.AddRow();
     Output0Buffer.prodid = cols[0];
     Output0Buffer.fruit = cols[3];
     Output0Buffer.dairy = cols[4];
}

Как сказал Билл. Убедитесь, что это компонент преобразования, а не пункт назначения. Возможны следующие варианты: источник, преобразование и назначение.

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

0 голосов
/ 21 апреля 2020

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

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

Обратите внимание, что:

  • это преобразование

  • Выход устанавливается в SynchronousInputID = Нет в разделе Входы и выходы Редактор преобразования сценариев

  • мой ввод просто называется Input и содержит один столбец с именем RawData

  • мой вывод называется GenOutput и имеет три столбцы

  • , хотя входной файл действительно имеет только 5 полей, есть завершающий | в конце каждой строки, так что это считается как 6

Установка синхронного на None означает, что Output0Buffer теперь распознается в контексте.

Код, который работает для меня: :

bool passedSOD;
bool passedEOD;

public override void_InputProcessInputRow(InputBuffer Row)
{
if (Row.RawData.Contains("ENDDATA"))
{
passedEOD = true;
GenOutputBuffer.SetEndOfRowset();
}

//IF WE HAVE NOT PASSED THE END OF DATA, BUT HAVE PASSED THE START OF DATA, SPLIT THE ROW
if (passedSOD && !passedEOD)
{
var SplitData = Row.RawData.Split('|');

//ONLY PROCESS IF THE ROW CONTAINS THE RIGHT NUMBER OF ELEMENTS I.E. EXPECTED NUMBER OF DELIMITERS
if (SplitData.Length == 6)
{
GenOutputBuffer.AddRow();
GenOutputBuffer.prodid = SplitData[0];
GenOutputBuffer.fruit = SplitData[3];
GenOutputBuffer.dairy = SplitData[4];
}

//SILENTLY DROPPING ROWS THAT DO NOT HAVE RIGHT NUMBER OF ELEMENTS FOR NOW - COULD IMPROVE THIS LATER
}

if (Row.RawData.Contains("STARTDATA"))
{
passedSOD = true;
}
}

Теперь мне нужно разобраться, как преобразовать одно из других полей из строкового в десятичное, но десятичное в ноль и разрешить ему выводить ноль, если кто-то сбросил «NA» в это поле: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...