2

ログ ファイルを 1 行ずつ読み取る必要があります。サイズは約6MBで、合計40000行です。しかし、プログラムをテストした後、そのログ ファイルは LF 文字のみで区切られていることがわかりました。だから私はクラスのReadlineメソッドを使用することはできませんStreamReader

この問題を解決するにはどうすればよいですか?

編集: テキスト リーダーを使用しようとしましたが、プログラムはまだ機能しませんでした:

using (TextReader sr = new StreamReader(strPath, Encoding.Unicode))
            {


                sr.ReadLine(); //ignore three first lines of log file
                sr.ReadLine(); 
                sr.ReadLine();

                int count = 0; //number of read line
                string strLine;
                while (sr.Peek()!=0)
                {
                    strLine = sr.ReadLine();
                    if (strLine.Trim() != "")
                    {
                        InsertData(strLine);
                        count++;
                    }
                }

                return count;
            }
4

4 に答える 4

9

TextReader.ReadLineだけで終了する行を既に処理しています\n

ドキュメントから:

行は、一連の文字の後にキャリッジ リターン (0x000d)、ライン フィード (0x000a)、キャリッジ リターンの後にライン フィード、Environment.NewLine、またはストリーム マーカーの終わりが続くものとして定義されます。返される文字列には、終了のキャリッジ リターンやライン フィードが含まれていません。入力ストリームの最後に到達した場合、戻り値は null 参照 (Visual Basic では Nothing) です。

だから、基本的には大丈夫なはずです。(メソッドが宣言されているためでTextReaderはなく、について話しました-明らかに、それはまだ動作します。)StreamReaderStreamReader

行を簡単に反復処理したい (そして潜在的にログ ファイルに対して LINQ を使用したい) 場合は、 MiscUtilLineReaderの私のクラスが役立つことがあります。基本的に、呼び出しをイテレータでラップします。たとえば、次のことができます。ReadLine()

var query = from file in Directory.GetFiles("logs")
            from line in new LineReader(file)
            where !line.StartsWith("DEBUG")
            select line;

foreach (string line in query)
{
    // ...
}

すべてのストリーミング:)

于 2009-07-17T08:44:30.857 に答える
3

File.ReadAllLines(fileName) は LF 行末のあるファイルを正しくロードしませんか? ファイル全体が必要な場合はこれを使用してください - 別の方法よりも遅いことを示しているサイトを見ましたが、正しいエンコーディング (デフォルトは UTF-8) を渡すとそうではなく、できるだけきれいです。

編集:そうです。また、ストリーミングが必要な場合、 TextReader.ReadLine() は Unix の行末も正しく処理します。

再度編集: StreamReader も同様です。ドキュメントを確認して、LF 行末を処理しないと仮定しましたか? Reflector を調べていますが、適切な処理ルーチンのようです。

于 2009-07-17T08:36:51.010 に答える
0

\LF (\n) で問題ないと思います (\CR (\r) のみでは問題が発生する可能性があります)。

一度に各行を1文字ずつ読み取り、ターミネータを読み取るときに処理できます。

プロファイリング後、これが遅すぎる場合は、read([]) でアプリ側のバッファリングを使用できます。ただし、最初は一度に簡単な文字を試してみてください。

于 2009-07-17T08:49:09.457 に答える
0

または、Readblock メソッドを使用して、自分で行を解析することもできます

于 2009-07-17T10:57:29.887 に答える