Как я могу использовать SSIS для условного переименования каждого файла в каталоге с уникальным именем? - PullRequest
0 голосов
/ 02 января 2019

У меня есть каталог с 5 файлами, содержащими информацию о дате и времени.Мне нужно убрать дату и время из каждого файла и переименовать каждый файл в понятное имя.

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

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

Любое руководство было бы замечательно.

Я пытался использовать цикл foreach SSIS с файловыми задачами, которые перемещают и переименовывают файлы, но это неуклюже.«Раз и навсегда» звучит в моей голове, но у меня возникают проблемы при разработке эффективного способа сделать это.

Нет кода, который работает на этот пост.

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

Допустим, файлы имеют следующие имена: «Тест EOY 01012018.xls», «Тест PLA 01022018.xls», «Тест 01032018 SHA.xls», «Тест EAD 01042018.xls», «Тест DOY 01052018.xls»."

Я хочу условно переименовать каждый файл, найдя часть его имени: Примеры: если fileName, например," EOY Test ", то" EOY_Test.XLS ", если fileName, например," Test PLA ", то" PLA_Test.XLS "и т. Д....

ОБНОВЛЕНИЕ: Мне пришлось изменить код, чтобы также удалить точки и несколько других символов из имени файла.Также добавлены новая переменная и строка directoryinfo для учета исходной и целевой папок.Вот модифицированный код из ответа @ userfl89:

 string fileDirectory_Source = Dts.Variables["User::PayrollSourceFilePath"].Value.ToString();
            string fileDirectory_Dest = Dts.Variables["User::PayrollDestFilePath"].Value.ToString();
            DirectoryInfo dirInfo_Source = new DirectoryInfo(fileDirectory_Source);
            DirectoryInfo dirInfo_Dest = new DirectoryInfo(fileDirectory_Dest);
            ///
            ///int i = 1;

            foreach (FileInfo fi in dirInfo_Source.EnumerateFiles())
            {
                ///Replace(" ", "_") + i 
                string newFileName = Regex.Replace(Path.GetFileNameWithoutExtension(fi.Name), "[0-9]|[.,/ -]", "").TrimEnd()+ fi.Extension;
                fi.MoveTo(dirInfo_Dest + newFileName);
                ///i++;
            }

ОБНОВЛЕНИЕ 2: Это ошибка, которую я получаю:

   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams)
   at Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()

1 Ответ

0 голосов
/ 03 января 2019

Ниже приведена задача C # Script, которая удалит часть даты (числовую) имен файлов, как вы перечислили, и не должна выполняться ни в каком цикле.В качестве «гарантии» к каждому файлу добавляется суррогатное число, чтобы сделать имена файлов уникальными в случае, если они не были уже после удаления номеров.Если вы уверены, что имена файлов всегда будут уникальными без дат, вы можете просто удалить переменную i int, добавленную к имени файла.Метод Path.GetFileNameWithoutExtension получает только имя файла, чтобы избежать создания файла с расширением в имени и сделать файл недействительным.Первый метод Replace используется для удаления чисел, при этом метод TrimEnd исключает конечный пробел между текстом и датами, предшествовавшими этому.Инкрементное число, начинающееся с 1, затем добавляется к имени файла для обеспечения уникальности.Внешний метод Replace используется для изменения расстояния между словами в именах файлов на подчеркивания, как в вашем примере, т.е. тест PLA изменяется на PLA_Test.XLS.После изменения имени файла на желаемый результат используется метод MoveTo, который перемещает, в основном, перезаписывает файлы с их новыми именами.Если путь к папке хранится в переменной SSIS, я изменил ее, чтобы получить из нее папку, однако при необходимости ее можно заменить.Если для хранения папки используется переменная, обязательно добавьте эту переменную в поле ReadOnlyVariables в редакторе задач Script.Для этого потребуются ссылки на пространства имен System.IO и System.Text.RegularExpressions для операций file и Regex соответственно.

        string fileDirectory = Dts.Variables["User::FolderPath"].Value.ToString();
        DirectoryInfo dirInfo = new DirectoryInfo(fileDirectory);

        int i = 1;

        foreach (FileInfo fi in dirInfo.EnumerateFiles())
        {
            string newFileName = Regex.Replace(Path.GetFileNameWithoutExtension(fi.Name), "[0-9]", "").TrimEnd().Replace(" ", "_") + i + fi.Extension;
            fi.MoveTo(fileDirectory + newFileName);
            i++;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...