4

C# を使用して大きなテキスト ファイルの最後の記号または行を読み取る最も効率的な方法は何ですか?

4

6 に答える 6

5

テキストファイルがASCIIであると仮定すると、この方法により、最後の文字に直接ジャンプし、ファイルの残りの部分を読み取ることを回避できます(これまでに与えられた他のすべての回答と同様)。

using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
    stream.Seek(-1, SeekOrigin.End);
    byte b = (byte)stream.ReadByte();
    char c = (char)b;
}

プログラムでマルチバイト エンコーディングを処理する必要がある場合は、Skeet's answerに示されているように、複雑なロジックを実行する必要がある場合があります。ただし、ケースが最後の文字の読み取りのみに制限されている場合は、予想されるエンコーディングに固有の簡略化されたバージョンを実装できます。以下のコードは、UTF-8 (現在最も一般的なエンコーディング) で機能します。はSeek、リーダーが前の文字の途中に到達する可能性がありますが、デコーダーは最後の文字を読み取るまでにそこから回復します。

FileInfo fileInfo = new FileInfo(path);
int maxBytesPerChar = Encoding.UTF8.GetMaxByteCount(1);
int readLength = Math.Min(maxBytesPerChar, (int)fileInfo.Length);

using (StreamReader reader = new StreamReader(path, Encoding.UTF8))
{
    reader.DiscardBufferedData();
    reader.BaseStream.Seek(-readLength, SeekOrigin.End);

    string s = reader.ReadToEnd();
    char c = s.Last();
}
于 2013-10-07T08:18:56.170 に答える
4

ファイルが大きすぎない場合は、行を読んで最後の行を選択してください。

string lastLine = File.ReadLines("pathToFile").LastOrDefault(); // if the file is empty

したがって、次の方法で最後の文字を取得します。

Char lastChar = '\0';
if(lastLine  != null) lastChar = lastLine.LastOrDefault();

File.ReadLines処理を開始する前にすべての行を読み取る必要がないため、メモリ消費の点で安価です。

J. Skeet からのより複雑な方法は次のとおりです。C# で反復子を使用してテキスト ファイルを逆方向​​に読み取る方法

于 2013-10-07T08:10:49.773 に答える
0
string s = File.ReadAllText("test.txt");
string[] split = s.Split(s[s.Length - 1]);

そして最後の行:-

var lastLine = File.ReadLines("test.txt").Last();
于 2013-10-07T08:11:10.857 に答える
0
using System;
using System.IO;

class Test
{
    public static void Main()
    {
        try
        {
            using (StreamReader sr = new StreamReader("TestFile.txt"))
            {
                String line = sr.ReadToEnd();
                Console.WriteLine(line[line.length-1);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("The file could not be read:");
            Console.WriteLine(e.Message);
        }
    }
}
于 2013-10-07T08:11:17.337 に答える