0

我正在尝试从日志文件中的每一行文本中删除任何“换行符”字符。

下面是我正在使用 Stream Reader 阅读的示例条目:-

<![LOG[Raising event:
[SMS_CodePage(850), SMS_LocaleID(2057)]
instance of SoftDistProgramStartedEvent
{
    AdvertisementId = "000216F6";
    ClientID = "GUID:B55C2757-CBAE-468E-B54F-46CAF2ECF68F";
    CommandLine = "\"C:\\WINNT\\system32\\cscript.exe\" /nologo Shutdown_Desktops_Overnight.vbs";
    DateTime = "20130211080211.784000+000";
    MachineName = "DWD*****";
    PackageName = "0000073C";
    ProcessID = 2516;
    ProgramName = "Shutdown Desktops Overnight";
    SiteCode = "S00";
    ThreadID = 3640;
    UserContext = "NT AUTHORITY\\SYSTEM";
    WorkingDirectory = "C:\\WINNT\\system32\\CCM\\Cache\\0000073C.1.System\\";
};
]LOG]!><time="08:02:11.800+000" date="02-11-2013" component="execmgr" context="" type="1" thread="3640" file="event.cpp:522">

在实际的日志文件中,这显示为文件中的一行,“换行符”替换为正方形。

我正在使用以下代码读取日志条目:-

using (StreamReader sr = new StreamReader(@"C:\Documents and Settings\riversd\Desktop\Logfile2.log"))
        {
            string Line;

            while ((Line = sr.ReadLine()) != null)
            {

            }
        }

问题是,当 StreamReader 从 txt 文件中读取此条目时,它会在以下位置中断:-

"<![LOG[Raising event:"

我需要即时删除此条目中的所有换行符。我不想将整个文件读入内存然后删除它们,我宁愿在阅读时处理每个日志。

是否可以?

4

3 回答 3

8

由于StreamReader.ReadLine的 MSDN 文档中的详细信息,对 Replace 的调用不起作用:

行定义为字符序列后跟换行符 ("\n")、回车符 ("\r") 或回车符后紧跟换行符 ("\r\n")。返回的字符串不包含终止的回车符或换行符

因此,如果您要使用 StreamReader.ReadLine 读取输入,您可以使用 StringBuilder.Append(而不是 AppendLine)构建一个新字符串,因为 StreamReader.ReadLine 会隐式删除换行符。

var filePath = "text.txt";
StringBuilder sb = new StringBuilder();

using (StreamReader reader = new StreamReader(filePath))
{
    while (!reader.EndOfStream)
    {
        sb.Append(reader.ReadLine());
    }
}

File.WriteAllText(filePath, sb.ToString());
于 2015-12-23T21:31:15.680 回答
2
sr.ReadLine().Replace(Environment.NewLine, String.Empty);

编辑: 如果行尾不是\r\n,但\n您可以使用正则表达式:

Line = Regex.Replace(sr.ReadLine(), @"(\r\n|\n)", String.Empty);
于 2013-02-20T10:58:13.540 回答
1

我不知道其他人是否有这个问题。这是我用来解决此问题的代码。

      using (System.IO.FileStream File = new System.IO.FileStream(e.FullPath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite))
            {
                using (System.IO.StreamReader Reader = new System.IO.StreamReader(File, Encoding.Default))
                {
                    String CompleteData = Reader.ReadToEnd();
                    foreach (String Line in CompleteData.Split(new char[] { (char)13 }, StringSplitOptions.RemoveEmptyEntries))
                    {
                        if (Line.Split(new String[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)[0].Contains("Raising event"))
                        {
                             //Do Stuff
                        }
                    }
                    Reader.Close();
                }
                File.Close();
            }

出于某种原因,我不得不这样做,因为仅使用 streamreader 会引发异常,说明该文件正在从另一个进程中使用。

它可能会在以后对其他人有所帮助..

于 2015-04-09T04:53:16.097 回答