我希望将IIS日志导入到SQL中,以便使用Bulk Insert进行报告,但是注释行(以#开头的那些行)会导致问题,因为这些行的字段数与数据行的字段数不同。
如果我手动删除注释,我就可以执行大容量插入。
是否有一种方法可以在排除基于匹配的行的同时执行批量插入,例如:任何以"#“开头的行。
谢谢。
发布于 2012-08-04 05:58:35
我通常使用的处理BULK INSERT和不规则数据的方法是将传入数据放入一个只有一个VARCHAR(MAX)列的临时临时表中。
一旦有了它,我就可以使用更灵活的决策工具,如SQL查询和字符串函数来决定从临时表中选择哪些行并将其带入我的主表中。这也很有帮助,因为BULK INSERT对特定文件失败的原因和原因的解释可能令人抓狂。
我能想到的唯一其他选择是在进行批量插入之前,使用预上载脚本来修剪注释和其他不符合表格条件的行。
发布于 2012-08-04 15:20:08
我推荐使用logparser.exe。LogParser有一些漂亮的neat capabilities on its own,但也可以用来格式化IIS日志,以便由SQL Server正确地导入。
发布于 2012-10-05 12:24:19
微软有一个名为"PrepWebLog“http://support.microsoft.com/kb/296093的工具,它可以剔除这些散列/井号字符,但是我现在运行它(使用PowerShell脚本处理多个文件),发现它的性能慢得让人无法忍受。
我想如果我写一个C#程序(或者甚至是宏)会更快。
更新: PrepWebLog刚刚在我身上崩溃了。我会避免的。
更新#2,我查看了PowerShell的Get-Content和Set-Content命令,但不喜欢其语法和可能的性能。所以我写了这个小的C#控制台应用:
if (args.Length == 2)
{
string path = args[0];
string outPath = args[1];
Regex hashString = new Regex("^#.+\r\n", RegexOptions.Multiline | RegexOptions.Compiled);
foreach (string file in Directory.GetFiles(path, "*.log"))
{
string data;
using (StreamReader sr = new StreamReader(file))
{
data = sr.ReadToEnd();
}
string output = hashString.Replace(data, string.Empty);
using (StreamWriter sw = new StreamWriter(Path.Combine(outPath, new FileInfo(file).Name), false))
{
sw.Write(output);
}
}
}
else
{
Console.WriteLine("Source and Destination Log Path required or too many arguments");
}这很快。
https://stackoverflow.com/questions/11803765
复制相似问题