1

我想将我的 IIS 日志导入 SQL 以使用 Bulk Insert 进行报告,但注释行 - 以 # 开头的注释行 - 会导致问题,因为这些行与数据行的编号 f 字段不同。

如果我手动删除了评论,我可以执行批量插入。

有没有办法执行批量插入,同时根据匹配排除行,例如:任何带有“#”的行。

谢谢。

4

4 回答 4

2

我通常对BULK INSERT不规则数据使用的方法是将传入数据推送到具有单列的临时临时表中VARCHAR(MAX)

一旦它在那里,我可以使用更灵活的决策工具,如 SQL 查询和字符串函数来决定我想从暂存表中选择哪些行并将其带入我的主表。这也很有帮助,因为BULK INSERT对于在特定文件上失败的原因和方式可能非常神秘。

我能想到的唯一其他选择是在批量插入之前使用预上传脚本来修剪不符合表格标准的评论和其他行。

于 2012-08-03T21:58:35.437 回答
1

我建议改用logparser.exe。LogParser 本身有一些非常简洁的功能,但它也可用于格式化 IIS 日志以由 SQL Server 正确导入。

于 2012-08-04T07:20:08.260 回答
0

Microsoft 有一个名为“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");
        }

它很快。


于 2012-10-05T04:24:19.120 回答
0

跟进 PeterX 所写的内容,我修改了应用程序以处理大型日志文件,因为任何足够大的文件都会导致内存不足异常。此外,由于我们只关心行的第一个字符是否以散列开头,我们可以在读取操作上使用 StartsWith() 方法。

class Program
{
    static void Main(string[] args)
    {
        if (args.Length == 2)
        {
            string path = args[0];
            string outPath = args[1];
            string line;

            foreach (string file in Directory.GetFiles(path, "*.log"))
            {
                using (StreamReader sr = new StreamReader(file))
                {
                    using (StreamWriter sw = new StreamWriter(Path.Combine(outPath, new FileInfo(file).Name), false))
                    {
                        while ((line = sr.ReadLine()) != null)
                        {
                            if(!line.StartsWith("#"))
                            {
                                sw.WriteLine(line);
                            }
                        }                          
                    }
                }

            }
        }
        else
        {
            Console.WriteLine("Source and Destination Log Path required or too many arguments");
        }
    }
}
于 2016-03-31T20:57:01.570 回答