Динамическое плоское соединение с SSIS для загрузки ежедневного файла с указанием даты, времени, минут и второй метки времени - PullRequest
0 голосов
/ 11 декабря 2018

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

Имя моего файла выглядит следующим образом: DS_All_users_with_additional_fields_2018_12_11_10_00.csv

, которое я пытался решить, используяследующее выражение, но все усложняется, если есть задержка в экспорте csv и минутные и вторые изменения в имени файла:

@ [User :: DataLoadDir] + "DS_All_users_with_additional_fields _" + (DT_STR, 4,1252)ГОД (DATEADD ("dd", -1, getdate ())) + "_" + (DT_STR, 4,1252) МЕСЯЦ (DATEADD ("dd", -1, getdate ())) + "_" + (DT_STR, 4,1252) ДЕНЬ (DATEADD ("dd", 0, getdate ())) + "_ 10_00.csv"

Есть предложения, как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Вы можете использовать перечислитель файлов цикла по каждому элементу и применить выражение спецификации файла:

DS_All_users_with_additional_fields*.csv

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

Я не думаю, что вы можете добавить * в саму строку подключения.

Обновление

Чтобы задать свойство строки подключения диспетчера подключений, см. Фотографию ниже.Важно отметить, что это решение изменит рабочий процесс.Ваш первоначальный рабочий процесс сообщал менеджеру соединений, какой файл нужно искать.Однако, благодаря реализации цикла foreach, задание теперь ищет все файлы, которые доступны в определенном пути к папке.Примечание: вам необходимо убедиться, что вы включили полное доменное имя (FQDN) в переменную строки подключения (например, \\ networkpath \ filename.csv)

enter image description here

0 голосов
/ 11 декабря 2018

Являются ли файлы, которые вам нужны для импорта, единственными файлами в этом каталоге с именем, начинающимся с DS_All_users_with_additional_fields_?Если это так, используйте задачу «Сценарий», чтобы найти самую последнюю, и задайте для переменной, используемой в строке подключения, это имя.В следующем примере LINQ используется для поиска файлов, которые начинаются с указанного вами имени, затем сортирует их по дате их создания и возвращает имя первого.Свойство Name ниже будет включать расширение.Вы также можете получить полный путь к файлу, изменив его на свойство FullName, и в этом случае вы можете просто использовать это значение для переменной, используемой строкой соединения с плоским файлом, в отличие от конкатенации его с переменной @[User::DataLoadDir].Этот пример ссылается на System.IO и System.Linq, как указано ниже.

using System.IO;
using System.Linq;

string filePath = Dts.Variables["User::DataLoadDir"].Value.ToString();
DirectoryInfo di = new DirectoryInfo(filePath);
FileInfo mostRecentFile = (from f in di.GetFiles().Where(x =>
                    x.Name.StartsWith("DS_All_users_with_additional_fields_"))
                      orderby f.CreationTime descending
                      select f).First();     

//The Name property below can be changed to FullName to get the complete file path
Dts.Variables["User::VariableHoldingFileName"].Value = mostRecentFile.Name;
...