Заполните OutputBuffer из списка в PostExecute, используя преобразователь C# - PullRequest
0 голосов
/ 28 апреля 2020

Продолжается сага о попытке разделить плоские файлы на пригодные для использования биты!

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

Друг очень любезно дал мне подсказку использовать List, а затем каким-то образом l oop через это в PostExecute ().

Основная проблема в том, что я не знаю, как выполнить l oop и создать строку для программного добавления в выходной буфер - там может быть переменное количество полей, перечисленных в плоском файле, есть нет согласованности. На данный момент я допустил 100 выходов и назвал их pos1, pos2, et c.

Что я действительно хотел бы сделать, так это посчитать все в моем списке, и l oop через это много раз, соответственно увеличивая числа - т.е. fieldlist [0] переходит к OutputBuffer.pos1, fieldlist [1] переходит к OutputBuffer.pos2, и если после этого ничего не происходит, то ничего не помещается в pos3 в pos100.

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

В файле есть все виды, но список полей удобно заключен между START-OF-FIELDS и END-OF-FIELDS. , поэтому я использовал тот же лог c, что и раньше, чтобы обрабатывать только строки в середине.

bool passedSOF;
bool passedEOF;

List<string> fieldlist = new List<string>();

public override void PostExecute()
{
base.PostExecute();

OutputBuffer.AddRow();
OutputBuffer.field1=fieldlist[0];
OutputBuffer.field2=fieldlist[1];
}

public override void Input_ProcessInputRow(InputBuffer Row)
{
if (Row.RawData.Contains("END-OF-FIELDS"))
{
passedEOF = true;
OutputBuffer.SetEndOfRowset();
}

if (passedSOF && !passedEOF)
{
fieldlist.Add(Row.RawData);
}

if(Row.RawData.Contains("START-OF-FIELDS"))
{
passedSOF = true;
}
}

У меня ничего не подчеркивается красным, но когда я пытаюсь запустить это, я получаю сообщение об ошибке PostExecute () и «ссылка на объект не установлена ​​для экземпляра объекта», что, как я думал, означало, что что-то содержало ноль, где не должно быть, но в моем тестовом файле У меня есть более двух полей между маркерами START и END.

Итак, во-первых, что я делаю не так в приведенном выше примере, а во-вторых, как мне сделать это в правильном l oop? Сейчас доступно только 100 возможных выходов, но со временем это может увеличиться.

Ответы [ 2 ]

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

Итак, еще раз я неправильно понял основную концепцию c - PostExecute нельзя использовать для записи так, как я пытался. Как указывали люди, здесь невозможно что-либо сделать с содержимым буфера.

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

Прежде всего, убедитесь, что в вашем пространстве имен есть следующее:

using System.Reflection;
using System.Linq;
using System.Collections.Generic;

Они будут использоваться для получения свойств выходного буфера и для вывода первого элемента в списке в pos_1, второго в pos_2, et c.

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

bool passedSOF;
bool passedEOF;

List<string> fieldlist = new List<string>();

Вот где это отличается - так как у меня есть что-то, что указывает на то, что я обработал свои строки, то есть строку, содержащую END-OF-FIELDS, когда я достигну этой точки, я должен записать мой собранный список в мой выходной буфер. Цель состоит в том, чтобы взять все несколько строк, содержащих имена полей, и превратить их в одну строку с несколькими столбцами, с именами полей, заполненными в этих столбцах в порядке их появления.

if (Row.RawData.Contains("END-OF-FIELDS"))
{
passedEOF = true;

//IF WE HAVE GOT TO THIS POINT, WE HAVE ALL THE DATA IN OUR LIST NOW
OutputBuffer.AddRow();

var fields = typeof(OutputBuffer).GetProperties();

//SET UP AND INITIALISE A VARIABLE TO HOLD THE ROW NUMBER COUNT
int rowNumber = 0;

foreach (var fieldName in fieldList)
{
//ADD ONE TO THE CURRENT VALUE OF rowNumber
rowNumber++;

//MATCH THE ROW NUMBER TO THE OUTPUT FIELD NAME
PropertyInfo field = fields.FirstOrDefault(x = > x.Name == string.Format("pos{0}", rowNumber));

if (field != null)
{
field.SetValue(OutputBuffer, fieldName);
}
}
OutputBuffer.SetEndOfRowset();
}

if (passedSOF && !passedEOF)
{
this.fieldList.Add(Row.RawData);
}

if (Row.RawData.Contains("START-OF-FIELDS"))
{
passedSOF = true;
}

Итак вместо того, чтобы что-то вроде этого:

  • НАЧАЛО ПОЛЯ
  • ФРУКТЫ
  • МОЛОЧНЫЕ
  • КУРИЛЬНЫЕ
  • КОНЕЦ- OF-FIELDS

У меня есть вывод:

pos_1 | pos_2 | pos_3

ФРУКТЫ | МОЛОЧНАЯ | STARCHES

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

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

"Post execute". По какой-то причине оно названо.

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

Что касается остальной части вашей постановки задачи ... она нуждается в фокусе

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