Может ли SSIS импортировать записи TXT в том же порядке, в каком они находятся в файле TXT?Если нет (по умолчанию), то как? - PullRequest
0 голосов
/ 16 октября 2018

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

Вот пример:

Order123, Customer1, 1/1/2018
Item1, $1
Item2, $1
Order124, Customer2, 1/1/2018
Item1, $1
Item4, $2

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

Если бы я использовал SSIS для импорта необработанных данных TXT в гибкую таблицу со столбцами, рассчитанными на разные типы данных (например, nvarchar (255) или аналогичные), я мог бы перебирать значения после импорта и связывать значенияв строке № 2 и строке № 3 с Order123;и, следовательно, строки № 5 и № 6 с Order124.

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

Это не 'Это действительно важно, но если вам интересно, то фактические данные, на которые я ссылаюсь, - это файлы событий данных Retrosheet.Это сборник всех данных Высшей лиги бейсбола.Настоящий файл можно загрузить по ссылке на этой странице: https://www.retrosheet.org/game.htm

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

В итоге:

Как мнеиспользовать SSIS для импорта данных, вставляя записи SQL в том же порядке, что и исходный плоский файл?

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Я только что набрал это, чтобы в синтаксисе могло быть несколько ошибок, но это должно вас закрыть.

Вам нужно будет настроить 2 разных выхода.

Порядок загрузки будетне важно, как вы добавляете внешний ключ в таблицу сведений.

public string orderNo; /// on the OUTSIDE

public main()



string[] lines = System.IO.File.ReadAllLines([filename]);

foreach(var line in lines)
{
   string[] cols = line.Split(',');
   if(cols.Length == 3)
   {
      orderNo = cols[0];
      Output0Buffer.AddRow();
      Output0Buffer.OrderNo = cols[0].ToString();
      Output0Buffer.Customer = cols[1].ToString();
      Output0Buffer.OrderDate = DateTime.Parse(cols[2].ToString().Trim());
   }
   else
   {
      Output1Buffer.AddRow();
      Output1Buffer.OrderNo = orderNo;
      Output1Buffer.Item = cols[0].ToString();
      Output1Buffer.Amt = cols[1].ToString(); //This needs to be parsed later.
   }
}

СЛЕДУЙТЕ ЗА:

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

Разделение по-прежнему кажется безопасным для использования, но вам придется обрезать некоторые заключенные в кавычки строки (имена), но похоже, что нет запятых в кавычках (вхотя бы в примерах).Если это так, вам нужно использовать REGEX для разделения.

Я бы изменил логику для использования switch и case и основал ее на cols [0], являющемся одним из 8 типов.

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

УДАЧИ со всем этим.Игры не выглядят легко интерпретировать!

0 голосов
/ 16 октября 2018

Ответ - да, плоские файлы обрабатываются по порядку, если вы не применяете какую-либо сортировку.

Я смог обработать файлы Retrosheet, создав таблицу в моей БД, котораяимел столбец идентификаторов и столбец varchar, достаточно длинный для размещения каждой строки файла (я выбрал 100).Затем я установил соединение с плоским файлом с форматированием Ragged Right, определив разделитель строк как {CR}{LF}.

...