根据csv文件的行数移动文件

问题描述:

我有一个SSIS包,它有一个.csv文件作为平面文件源。条件拆分根据ID将数据插入到各个SQL Server登台表中。任何未成功插入的行都会重定向到错误.csv文件,每个ID一个。根据csv文件的行数移动文件

有了这些众多的错误文件,我想对有多少行(除了标题行)进行评估。如果至少有一个数据错误行,这些行将通过发送电子邮件任务发送给源开发人员,否则将通过文件系统任务进行存档。

我正在努力如何解决这个问题。我有一些想法,可以使用错误文件目录中的Foreach循环容器循环并通过脚本任务执行行计数。但是,我不确定如何将单个文件名传递给脚本任务。此外,我不确定事后可以做有条件的电子邮件/文件系统任务移动。

在脚本任务方面,脚本任务的东西看起来像这样(它是错误的),失败的是它不会超过1并被归档,通过它被通过电子邮件发送,只是为了某种想法。我对复杂的C#脚本颇为新颖。

 public void Main() 
     { 
     string folderPath = Dts.Variables["User::errorDirectory"].Value.ToString(); 
     string archivePath = @"\\SERVER\placeholderfilepath\blah\blah"; 
     var FileNames = new List<string>(); 
     var FilePaths = new List<string>(); 

     DirectoryInfo directoryInfo = new DirectoryInfo(folderPath); 
     FileInfo[] files = directoryInfo.GetFiles(); 

     var lineCount = 0; 


     foreach (FileInfo fileInfo in files) 
     { 

      lineCount = File.ReadAllLines(fileInfo.FullName).Count(); 

      //MessageBox.Show(lineCount.ToString()); 

      if (lineCount == 1) 
      { 
       File.Move(folderPath, archivePath); 
      } 

     } 




     Dts.TaskResult = (int)ScriptResults.Success; 

     } 

经过几个小时的搜索后,我找不到任何涵盖此内容的内容,因此会感谢任何指针/文章。

在此先感谢。

您可能会尝试向将数据写入.CSV的数据流添加行计数组件。行计数就会把行数的一些变量,然后你就会知道,如果有在.CSV

任何行,我可以看到这个问题在你的代码

string folderPath = Dts.Variables["User::errorDirectory"].Value.ToString(); 
     string archivePath = @"\\SERVER\placeholderfilepath\blah\blah"; 
     var FileNames = new List<string>(); 
     var FilePaths = new List<string>(); 

     DirectoryInfo directoryInfo = new DirectoryInfo(folderPath); 
     FileInfo[] files = directoryInfo.GetFiles(); 

     var lineCount = 0; 


     foreach (FileInfo fileInfo in files) 
     { 

      lineCount = File.ReadAllLines(fileInfo.FullName).Count(); 

      //MessageBox.Show(lineCount.ToString()); 

      if (lineCount == 1) 
      { 
       File.Move(fileInfo.FullName, Path.Combine(archivePath, fileInfo.Name)); 
      } 

     } 

     Dts.TaskResult = (int)ScriptResults.Success; 
+0

我曾考虑过这一点,但我想知道是否可以通过脚本更有效地完成比设置大量行计数变量。将会有10个这样的文件启动,并且我预计这个数字会随着时间的推移而增加,所以想要做出这个面向未来的预测。 – TJB

+0

是否考虑过对这些ID值的循环?在这种情况下,所有ID将重复使用相同的流程。或者你想发送一封包含所有错误.CSV的邮件? –

+0

我真正想要的是评估目录中的每个文件。如果RowCount大于1,则将文件保留在那里,否则将其移至归档文件夹。我想遍历目录中的每个文件,打开它,执行行计数来完成此操作。邮件任务只会选取尚未移动的文件,因此这不是该位的问题。我正在努力的是一些脚本来读取文件名的每个包变量,对行进行计数并决定是否对其进行存档。 – TJB

而不是ForEach循环来计算文件,只处理脚本任务中的所有内容。使用filesystemobject获取文件夹中文件的集合,并使用集合的count属性。

+0

感谢评论...然而,它是目录中每个文件的行数,而不仅仅是文件的数量。 – TJB

+0

好吧,你仍然可以跳过foreach循环,并在脚本中做所有事情。或者,如果您想要将文件名从循环传递到脚本,则可以使用包变量。 –

+0

我还应该提到,这些文件每天都会生成,文件名每天都会动态更改(通过每个错误文件的包变量)。 – TJB