如何使用SSIS有条件地使用唯一名称重命名目录中的每个文件?

时间:2019-01-02 20:57:16

标签: c# loops ssis

我有一个包含5个文件的目录,其中包含日期时间信息。我需要从每个文件中删除日期时间,并将每个文件重命名为友好名称。

我在想出此任务的结构时遇到了麻烦,但是我想我需要在脚本任务中使用一个循环来有条件地重命名文件,但是在互联网上却找不到很多执行此任务的示例功能。

我还考虑了一次脚本任务,该任务可以立即重命名目录中的所有文件。

任何指导都会很棒。

我尝试将SSIS foreach循环与用于移动和重命名文件的文件任务一起使用,但这很笨拙。 “只有一次”在我的脑海中响起,但是我很难找到一种有效的方法来做到这一点。

截至本文为止,尚无适用的代码。

我想根据部分名称匹配来重命名每个文件,以便目标目录包含不包含不必要的日期信息的干净文件名。

假设文件的命名如下: “ EOY测试01012018.xls” “测试PLA 01022018.xls” “测试01032018 SHA.xls” “ EAD测试01042018.xls” “测试DOY 01052018.xls”

我想通过查找文件名的一部分来有条件地重命名每个文件: 例子: 如果文件名类似于“ EOY测试”,则为“ EOY_Test.XLS” 如果文件名类似于“ 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 :(得分:1)

以下是C#脚本任务,它将删除您列出的文件名的日期(数字)部分,并且不需要在任何类型的循环中执行。作为“保护措施”,在每个文件后都会附加一个代理号码,以使文件名唯一(以防万一这些号码在删除后还没有)。如果您确定文件名在没有日期的情况下将始终是唯一的,则只需删除添加到文件名中的i int变量即可。 Path.GetFileNameWithoutExtension方法仅获取文件名,以避免创建名称中带有扩展名的文件并使该文件无效。第一种Replace方法用于删除数字,而TrimEnd方法则省略了文本与日期之间的尾部空格。然后将以1开头的递增数字添加到文件名中以确保唯一性。外部Replace方法用于将文件名中单词之间的空格更改为下划线,如您的示例所示,即Test PLA更改为PLA_Test.XLS。将文件名更改为所需的输出后,将使用MoveTo方法移动并基本上覆盖具有新名称的文件。如果文件夹路径存储在SSIS变量中,我将对其进行修改以从中获取文件夹,但是如果需要,可以将其替换。如果使用变量存储文件夹,请确保在脚本任务编辑器的ReadOnlyVariables字段中添加此变量。这将需要分别引用文件和Regex操作的System.IOSystem.Text.RegularExpressions命名空间。

        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++;
        }