Stream Reader Readline检测换行符

时间:2013-02-20 10:55:28

标签: c# string streamreader

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

以下是我使用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:"

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

有可能吗?

3 个答案:

答案 0 :(得分:4)

由于MSDN doc of StreamReader.ReadLine:

中的详细信息,对Replace的调用无效
  

一行被定义为字符序列,后跟换行符(“\ n”),回车符(“\ r”)或回车符后紧跟换行符号(“\ r \ nn “)。 返回的字符串不包含终止回车符或换行符

因此,如果您要使用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());

答案 1 :(得分: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会抛出一个异常,说该文件正在使用另一个进程。

以后可能会帮助别人..

答案 2 :(得分:0)

sr.ReadLine().Replace(Environment.NewLine, String.Empty);

修改 如果行尾不是\r\n而是\n,则可以使用正则表达式:

Line = Regex.Replace(sr.ReadLine(), @"(\r\n|\n)", String.Empty);