【发布时间】:2019-01-02 20:57:16
【问题描述】:
我有一个包含 5 个包含日期时间信息的文件的目录。我需要从每个文件中删除日期时间并将每个文件重命名为友好名称。
我在想出这个任务的结构时遇到了麻烦,但我认为我需要在脚本任务中使用循环来有条件地重命名文件,但在互联网上没有找到很多执行此操作的示例功能。
我还考虑了一次重命名目录中所有文件的脚本任务。
任何指导都会很棒。
我尝试将 SSIS foreach 循环用于移动和重命名文件的文件任务,但它很笨重。 “一次且只有一次”在我脑海中响起,但我很难找到一种有效的方法来做到这一点。
在这篇文章中没有代码可以工作。
我想根据部分名称匹配重命名每个文件,以便目标目录包含排除不必要的日期信息的干净文件名。
假设文件命名如下: “EOY测试01012018.xls” “测试 PLA 01022018.xls” “测试 01032018 SHA.xls” “EAD 测试 01042018.xls” "测试 DOY 01052018.xls"
我想通过查找文件名称的一部分来有条件地重命名每个文件: 例子: 如果文件名像“EOY Test”那么“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()
【问题讨论】:
-
如果您有两个包含 EOY 或其他标识符的文件会怎样?您是只想在文件名末尾附加一个数字还是在文件名中使用日期时间?
-
请假设除非日期更改,否则名称不会更改。我想完全消除名称中的日期部分并重命名文件。