0

ログ ファイルのテキストの各行から「改行」文字を削除しようとしています。

以下は、ストリーム リーダーで読み込んでいるエントリの例です:-

<![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">

実際のログファイルでは、これはファイル内の 1 行として表示され、「改行文字」が四角に置き換えられます。

次のコードを使用してログエントリを読み取ります:-

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 を使用して入力を読み取る場合は、StreamReader.ReadLine が改行文字を暗黙的に削除するため、StringBuilder.Append (AppendLine ではない) を使用して新しい文字列を作成できます。

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 に答える