我正在尝试从日志文件中的每行文本中删除任何“新行”字符。
以下是我使用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:"
我需要动态删除此条目中的所有新行字符。我不想将整个文件读入内存然后删除它们,我宁愿在阅读时处理每个日志。
有可能吗?
答案 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);