Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 分析多行中相关数据的日志文件_C#_Winforms_Parsing_Logfile - Fatal编程技术网

C# 分析多行中相关数据的日志文件

C# 分析多行中相关数据的日志文件,c#,winforms,parsing,logfile,C#,Winforms,Parsing,Logfile,C#,Winforms: 我需要解析一个日志文件。此文件包含来自程序的事务请求,但程序跨多行写入事务 我需要获取ID,以及请求是否因任何原因被处理或拒绝。问题是这些请求在多行上。我唯一的可取之处是它们包含来自记录器的相同时间戳。(##)不可用,因为它是临时占位符,因此(19)可能在整个日志中重复多次 我正在考虑扫描PR#U请求,将ID#和时间戳替换,但我不知道如何使streamreader向下移动到下4行,并将其写入文件中的一行 示例: 2016年10月6日08:09:33.031(1)请购单

C#,Winforms: 我需要解析一个日志文件。此文件包含来自程序的事务请求,但程序跨多行写入事务

我需要获取ID,以及请求是否因任何原因被处理或拒绝。问题是这些请求在多行上。我唯一的可取之处是它们包含来自记录器的相同时间戳。(##)不可用,因为它是临时占位符,因此(19)可能在整个日志中重复多次

我正在考虑扫描PR#U请求,将ID#和时间戳替换,但我不知道如何使streamreader向下移动到下4行,并将其写入文件中的一行

示例:


2016年10月6日08:09:33.031(1)请购单:IID=caa23b14,
2016年10月6日08:09:33.031(1)PR_Mon:IID=caa23b14,
2016年10月6日08:09:33.031(1)恢复|开始
2016年10月6日08:09:33.031(1)恢复触发SC-TI


2016年10月6日08:19:04.384(19)请购单:IID=90dg01b,
2016年10月6日08:19:04.384(19)PR_Mon:IID=90dg01b,
06/10/16 08:19:04.384(19)恢复|拒绝:未授予访问权限。

我需要输出在一个文件的单行中。这样,我就可以用另一个程序解析它,并将数据输入数据库

06/10/16 08:09:33.031请求:IID=caa23b14 |恢复|开始|恢复|触发| SC-TI
2016年10月6日08:19:04.384公关请求:IID=90dg01b |简历|被拒绝:未授予访问权限。

编辑:

好的,我想我这里有一个基本代码。有点管用。这花费了很长时间,因为当我发现另一个文件拖缆与PR_请求匹配时,我不得不打开另一个文件拖缆,然后用相同的fullstamp(日期+进程号)再次扫描该文件。然后,它将查找RESUME | BEGIN或RESUME | DENIED,然后写出成功或失败

是否有任何方法可以通过将streamreader行放在它最初发现PR_请求的位置,让它从另一行开始,再数到5行,然后停止它来加快速度?这将大大加快该计划的速度

        string inputfolder = inputloctxt.Text;
        string outputfolder = saveloctxt.Text;
        string outputfile = @"ParsedFile.txt";

        try
        {
            string[] readfromdir = Directory.GetFiles(outputfolder);
            foreach (string readnow in readfromdir)
            {
                using (StreamReader fileread = new StreamReader(readnow))
                {
                    string fileisreading;
                    while ((fileisreading = fileread.ReadLine()) != null)
                    {
                        if (fileisreading.Contains("PR_Request"))
                        {
                            string resumed = null;
                            string fullstamp = fileisreading.Substring(1, 26);
                            string datestamp = fileisreading.Substring(1, 21);
                            string requesttype = fileisreading.Substring(27, 22);
                            string iidnum = fileisreading.Substring(53, 8);
                            using (StreamReader grabnext01 = new StreamReader(readnow))
                            {
                                string grabnow01;
                                while ((grabnow01 = grabnext01.ReadLine()) != null)
                                {
                                    if (grabnow01.Contains(fullstamp))
                                    {
                                        if (grabnow01.Contains("RESUME|BEGIN"))
                                        {
                                            resumed = "TRUE";
                                            break;
                                        }
                                        else if (grabnow01.Contains("RESUME|DENIED"))
                                        {
                                            resumed = "FALSE";
                                            break;
                                        }
                                    }
                                }
                            }
                            File.AppendAllText(outputfolder + outputfile, 
                               datestamp + " " + requesttype + " " + iidnum + " " + resumed + Environment.NewLine);
                            resumed = null;
                        }
                    }
                }
            }
        }

听起来您需要使用正则表达式。有一个命名空间System.Text.RegularExpressions,您可以使用并引用我在示例中为您创建的捕获组

请参考以下网站:

我开始为你的正则表达式,它不漂亮,但它应该完成工作

(?:\d{2}\/\d{2}\/\d{2}\s\d{2}\:\d{2}\:\d{2}\.\d{3}\s\(\d+\)\s)(PR_Request: IID=[^,\n]+)(?:\,\n\d{2}\/\d{2}\/\d{2}\s\d{2}\:\d{2}\:\d{2}\.\d{3}\s\(\d+\)\sPR_Mon: IID=[^,\n]*\,\n\d{2}\/\d{2}\/\d{2}\s\d{2}\:\d{2}\:\d{2}\.\d{3}\s\(\d+\)\s)((RESUME|BEGIN|\||DENIED: Access not granted.)*)(?:\n\d{2}\/\d{2}\/\d{2}\s\d{2}\:\d{2}\:\d{2}\.\d{3}\s\(\d+\)\s)*((RESUME_TRIG|SC\-TI|\|)*)

搜索
PR\u Request
似乎可以确定开始,问题是如何找到结束(根据给定的输入数据不清楚)?然后(如果你知道它在哪里结束的话)从头到尾地遍历行,删除“
”之前的任何内容,并输出剩余的内容(可能删除
,如果有的话,在末尾删除
,将
替换为
,以及所有这些小东西,这应该不是问题。在任何情况下,考虑添加您的未决解决方案并指定问题所在。因为我真的看不到它。@Sinatr日志部分以一个新的时间戳结束。有问题的程序似乎用日期时间占位符触发的事件来记录它。那个触发的事件然后在多行上吐出它所做的事情。问题是这些新行不包含引用中的ID,因此我不能简单地获取具有相同ID的所有内容。我需要让我的程序扫描文件,找到PR#U请求,获取ID#,然后向下走1或2行以查看实际发生的情况(是否被拒绝,是否通过等)。我可以匹配时间戳,我不知道如何使用streamreaderIt为这些行编制索引。如果没有关于日志文件可以包含哪些内容的更详细的知识,就不可能回答这个问题。括号中的数字是多少,它是线程ID吗?在什么情况下可以重用它?@Martinbrowni用我的代码更新了这个问题。我知道这是非常基本的,它只是打开一个流阅读器,但我真的不知道该怎么做,一旦程序开始扫描。easymoney202声明使用正则表达式,所以我将尝试使用它。虽然研究如何将其放入while循环需要时间。谢谢!我将尝试使用reg表达式。我不完全知道这是怎么回事,所以我可能需要一些时间来回复结果,这样我才能分析这些信息。如果你把我做的示例放到regex101链接中,它可以帮助解释它的作用是什么!我明白了。我看到它找到了我请求的所有内容,但有没有办法将其解析为一行?如果你看一下我编辑的代码示例,我有一些东西可以实现我想要的,但是速度非常慢。我喜欢你的方法,因为它能一次找到所有东西,但我不太清楚如何实现它。您能否提供一个示例?将回车符(\r\n)替换为换行符(\n)
var txt=@“。替换(“\r\n”,“\n”);正则表达式r=新正则表达式(@“”);var matches=r.matches(txt);这对你有帮助吗?如果是,请标记为答案,如果不是,请让我知道您还需要什么帮助