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