解析日志文件时如何获取或设置值

时间:2013-10-17 09:41:55

标签: c# parsing logging

您好我正在尝试通过我的应用程序中的RoboCopy方法从日志文件中获取复制的文件数量值。日志文件始终采用以下格式:


ROBOCOPY :: Windows强大的文件复制::版本XP010

开始于:2013年10月10日10:08:51

来源:\ ad \ nas \ Dev_Code \ ITA \ Stats \ 11.6.4.15 \ CFI \ Build \      Dest:C:\ inetpub \ CFI \

Files : *.*

选项: / FFT / NFL / TEE / S / E / COPY:DAT / Z / IS / R:5 / W:5


                   1    \\ad\nas\Dev_Code\ITA\Stats\11.6.4.15\CFI\Build\

            Total    Copied   Skipped  Mismatch    FAILED    Extras
 Dirs :         1         0         1         0         0         0
**Files :         1**         1         0         0         0         0
Bytes :    1.62 m    1.62 m         0         0         0         0
Times :   0:00:03   0:00:02                       0:00:00   0:00:00

Speed :              607364 Bytes/sec.
Speed :              34.753 MegaBytes/min.

Ended : Thu Oct 10 10:08:59 2013

到目前为止,我能够将文件读入流读取器,但我能做些什么来确保我总是选择文件的最后一个实例:然后是Total列下的值,即1

try
{
// Open file for reading.
using (StreamReader r = new StreamReader(@"C:\LogFile.log"))
{
    // 2.
    // Read each line until EOF.
    string line;
    while ((line = r.ReadLine()) != null)
    {
        // 3.
        // Do stuff with line.
        if (line.Contains("Files"))
        {
            String content = line.ToString();
            char sep = '\t';
            string[] splitContent = content.Split(sep);
            Console.WriteLine(splitContent);
        }                        
    }
}
}
catch (Exception)
{

throw;
}

min = System.String []

的输出

3 个答案:

答案 0 :(得分:2)

您只需选择数组中的 second 项目,即

Console.WriteLine(splitContent[1]);

考虑一下,您的行数据看起来像

Files :\t1\t1\t0\t0\t0\t0

当您致电content.Split(sep)时,您的阵列将显示为

0: "Files :"
1: "1"
2: "1"
3: "0"
4: "0"
5: "0"
6: "0"

因此,如果您根据进行映射,则始终需要提取位于索引Total的{​​{1}}列(1作为标签列)。


你甚至可以在这里使用emum以获得可读性,例如

0

或使用enum Columns { Label, Total, Copied, Skipped, Mismatch, Failed, Extra } ... string[] rowData = content.Split('\t'); Console.WriteLine(rowData[(int)Columns.Total]); 来避免演员

const

答案 1 :(得分:0)

试试这个:

foreach(var section in splitContent)
{
    Console.Write("{0}\t", section);
}
Console.WriteLine();

答案 2 :(得分:0)

这是我完整的工作示例:

static void Main()
    {
        try
        {              
            // Open file for reading.
            using (StreamReader r = new StreamReader(@"C:\LogFile.log"))
            {
                // 2.
                // Read each line until EOF.
                string line;
                while ((line = r.ReadLine()) != null)
                {
                    // 3.
                    // Do stuff with line.
                    if (line.Contains("Files"))
                    {
                        if (!line.Contains("Files : *.*"))
                        {
                            String content = line.ToString();

                            string[] splitContent = System.Text.RegularExpressions.Regex.Replace(content, @"\s+", " ").Split(' ');

                            //foreach (string s in splitContent)
                            //Console.WriteLine(s);
                            Console.WriteLine(splitContent[3]);
                        }                           
                    }                        
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }