我有一个文件夹,我每隔半小时就会收到带有时间戳的.csv文件。现在,我需要从可用文件中获取最新文件并将其导入sql server。
例如
在我的源文件夹中,我有
test_01112012_120122.csv
test_01112012_123022.csv
test_01112012_123555.csv
现在我需要获取最新文件并在SSIS的帮助下将该文件导入sql server。
感谢
萨蒂什南比亚
答案 0 :(得分:15)
即使您使用SSIS作为导入工具,也需要来自@garry Vass的代码,或者类似的代码。
在SSIS中,您需要将连接字符串更新为平面文件连接管理器以指向新文件。因此,您需要确定最新文件是什么。
无论您是通过文件属性(Garry的代码)还是文件名切片和切块,都取决于您的业务规则。它始终是最近修改过的文件(属性)还是需要基于被解释为序列的文件名。如果test_01112012_120122.csv
中有错误并且内容已更新,则这很重要。修改日期将更改,但文件名不会更改,并且这些更改不会被移植回数据库。
我建议您创建2个String类型的变量,并将其范围限定为名为RootFolder
和CurrentFile
的包。 (可选)如果要限制为*.csv
等特定类型,则可以创建一个名为FileMask的文件。 RootFolder
将是您希望在C:\ssisdata\MyProject
中查找文件的基本文件夹。 CurrentFile
将从完全限定路径的脚本分配给最近修改过的文件的值。我发现在这一点上将设计时值分配给CurrentFile很有帮助,通常是集合中最旧的文件。
将脚本任务拖到控制流上并设置为ReadOnlyVariable User :: RootFolder(可选择User :: FileMask)。您的ReadWriteVariable将是User :: CurrentFile。
此脚本将进入public partial class ScriptMain: ...
大括号
/// <summary>
/// This verbose script identifies the most recently modified file of type fileMask
/// living in RootFolder and assigns that to a DTS level variable.
/// </summary>
public void Main()
{
string fileMask = "*.csv";
string mostRecentFile = string.Empty;
string rootFolder = string.Empty;
// Assign values from the DTS variables collection.
// This is case sensitive. User:: is not required
// but you must convert it from the Object type to a strong type
rootFolder = Dts.Variables["User::RootFolder"].Value.ToString();
// Repeat the above pattern to assign a value to fileMask if you wish
// to make it a more flexible approach
// Determine the most recent file, this could be null
System.IO.FileInfo candidate = ScriptMain.GetLatestFile(rootFolder, fileMask);
if (candidate != null)
{
mostRecentFile = candidate.FullName;
}
// Push the results back onto the variable
Dts.Variables["CurrentFile"].Value = mostRecentFile;
Dts.TaskResult = (int)ScriptResults.Success;
}
/// <summary>
/// Find the most recent file matching a pattern
/// </summary>
/// <param name="directoryName">Folder to begin searching in</param>
/// <param name="fileExtension">Extension to search, e.g. *.csv</param>
/// <returns></returns>
private static System.IO.FileInfo GetLatestFile(string directoryName, string fileExtension)
{
System.IO.DirectoryInfo directoryInfo = new System.IO.DirectoryInfo(directoryName);
System.IO.FileInfo mostRecent = null;
// Change the SearchOption to AllDirectories if you need to search subfolders
System.IO.FileInfo[] legacyArray = directoryInfo.GetFiles(fileExtension, System.IO.SearchOption.TopDirectoryOnly);
foreach (System.IO.FileInfo current in legacyArray)
{
if (mostRecent == null)
{
mostRecent = current;
}
if (current.LastWriteTimeUtc >= mostRecent.LastWriteTimeUtc)
{
mostRecent = current;
}
}
return mostRecent;
// To make the below code work, you'd need to edit the properties of the project
// change the TargetFramework to probably 3.5 or 4. Not sure
// Current error is the OrderByDescending doesn't exist for 2.0 framework
//return directoryInfo.GetFiles(fileExtension)
// .OrderByDescending(q => q.LastWriteTimeUtc)
// .FirstOrDefault();
}
#region ScriptResults declaration
/// <summary>
/// This enum provides a convenient shorthand within the scope of this class for setting the
/// result of the script.
///
/// This code was generated automatically.
/// </summary>
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
#endregion
}
此时,我们的脚本已为CurrentFile变量赋值。下一步是告诉SSIS我们需要使用该文件。在CSV的Connection Manager中,您需要为ConnectionString设置表达式(F4或右键单击并选择“属性”)。您要分配的值是我们的CurrentFile变量,表达的方式是@[User::CurrentFile]
最后,这些屏幕截图基于即将发布的SQL Server 2012,因此图标可能看起来不同但功能仍然相同。
答案 1 :(得分:3)
假设你想使用C#来获取给定目录中的最新文件,你可以使用这样的方法......
private static FileInfo GetLatestFile(string directoryName, string fileExtension)
{
DirectoryInfo directoryInfo = new DirectoryInfo(directoryName);
return directoryInfo.GetFiles(fileExtension)
.OrderByDescending(q => q.LastWriteTimeUtc)
.FirstOrDefault();
}
此方法称为...
FileInfo file = GetLatestFile(“C:\ myDirectory”,“* .csv”);
它返回具有最近写入时间的文件的FileInfo实例(或null)。然后,您可以使用FileInfo实例获取文件的名称,以便进行处理......
答案 2 :(得分:-1)
看一下这篇文章,了解tsql http://www.simple-talk.com/sql/t-sql-programming/the-tsql-of-text-files/
中的目录列表然后你可以通过订购它们找到最新的。