22

テキストファイルを読み取り、それを処理してセクションに分割するプログラムがあります。

問題は、ストリーム リーダーを使用してファイルを読み取るときに、プログラムがファイルの最初の 5 行の読み取りをスキップできるようにプログラムを変更するにはどうすればよいかということです。

誰かがコードについてアドバイスしてもらえますか? ありがとう!

コード:

class Program
{
    static void Main(string[] args)
    {
        TextReader tr = new StreamReader(@"C:\Test\new.txt");

        String SplitBy = "----------------------------------------";

        // Skip first 5 lines of the text file?
        String fullLog = tr.ReadToEnd();

        String[] sections = fullLog.Split(new string[] { SplitBy }, StringSplitOptions.None);

        //String[] lines = sections.Skip(5).ToArray();

        foreach (String r in sections)
        {
            Console.WriteLine(r);
            Console.WriteLine("============================================================");
        }
    }
}
4

6 に答える 6

27

以下を試してください

// Skip 5 lines
for(var i = 0; i < 5; i++) {
  tr.ReadLine();
}

// Read the rest
string remainingText = tr.ReadToEnd();
于 2010-12-11T18:49:34.020 に答える
13

行が固定されている場合、最も効率的な方法は次のとおりです。

using( Stream stream = File.Open(fileName, FileMode.Open) )
{
    stream.Seek(bytesPerLine * (myLine - 1), SeekOrigin.Begin);
    using( StreamReader reader = new StreamReader(stream) )
    {
        string line = reader.ReadLine();
    }
}

行の長さが異なる場合は、次のように一度に 1 行ずつ読む必要があります。

using (var sr = new StreamReader("file"))
{
    for (int i = 1; i <= 5; ++i)
        sr.ReadLine();
}
于 2010-12-11T18:57:12.060 に答える
8

プログラムで何度も使用したい場合は、行をスキップする機能を備えたStreamReaderから継承されたカスタムクラスを作成することをお勧めします。

このようなことができます:

class SkippableStreamReader : StreamReader
{
    public SkippableStreamReader(string path) : base(path) { }

    public void SkipLines(int linecount)
    {
        for (int i = 0; i < linecount; i++)
        {
            this.ReadLine();
        }
    }
}

この後、SkippableStreamReaderの関数を使用して行をスキップできます。例:

SkippableStreamReader exampleReader = new SkippableStreamReader("file_to_read");

//do stuff
//and when needed
exampleReader.SkipLines(number_of_lines_to_skip);
于 2013-01-31T18:57:40.397 に答える
5

リストにさらに 2 つの提案を追加します。

常にファイルがあり、読み取りのみを行う場合は、次のことをお勧めします。

var lines = File.ReadLines(@"C:\Test\new.txt").Skip(5).ToArray();

File.ReadLines は、他のファイルからファイルをブロックせず、必要な行のみをメモリに読み込みます。

ストリームが他のソースから来る場合は、次のアプローチをお勧めします。

class Program
{
    static void Main(string[] args)
    {
        //it's up to you to get your stream
        var stream = GetStream();

        //Here is where you'll read your lines. 
        //Any Linq statement can be used here.
        var lines = ReadLines(stream).Skip(5).ToArray();

        //Go on and do whatever you want to do with your lines...
    }
}

public IEnumerable<string> ReadLines(Stream stream)
{
    using (var reader = new StreamReader(stream))
    {
        while (!reader.EndOfStream)
        {
            yield return reader.ReadLine();
        }
    }
}

Iterator ブロックは、作業が完了すると自動的にクリーンアップされます。これが正確にどのように機能するかについて詳しく説明している Jon Skeet による記事を次に示します (「最後に...」セクションまでスクロールします)。

于 2014-09-16T17:59:25.070 に答える
1

私はそれが次のように簡単だと思います:

    static void Main(string[] args)
    {
        var tr = new StreamReader(@"C:\new.txt");

        var SplitBy = "----------------------------------------";

        // Skip first 5 lines of the text file?
        foreach (var i in Enumerable.Range(1, 5)) tr.ReadLine();
        var fullLog = tr.ReadToEnd(); 

        String[] sections = fullLog.Split(new string[] { SplitBy }, StringSplitOptions.None);

        //String[] lines = sections.Skip(5).ToArray();

        foreach (String r in sections)
        {
            Console.WriteLine(r);
            Console.WriteLine("============================================================");
        }
    }
于 2010-12-11T19:00:47.757 に答える