2010-12-11 10 views
14

私は、テキストファイルを読み込んでそれをセクションに分けて処理するプログラムを持っています。C#ストリームリーダーを使用してテキストファイルを読み取っているときに行数をスキップするにはどうすればよいですか?

それでは、プログラムがストリームリーダーを使ってファイルを読み込んでいる間にファイルの最初の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("============================================================"); 
     } 
    } 
} 
+1

コメントアウトされた行を使用する際の問題は何ですか? –

+0

.splitメソッドが機能しないというエキスパートを表示します。 – JavaNoob

+0

[C#配列にテキストがカバリングされた後にテキストファイルの行をスキップする方法](http://stackoverflow.com/questions/4417916/c-how-to-skip-lines-in-text-file-after -text-coverted-to-array) – ChrisF

答えて

22

行は次のように最も効率的な方法があり、その後固定されている場合は、次の

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

// Read the rest 
string remainingText = tr.ReadToEnd(); 
+0

それはうまく動作します! – JavaNoob

8

をお試しください:

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(); 
} 
+2

他の解決策とは違って、ここではスキップしている行の読み方が気にならず、他の解決策よりはるかに高速でなければなりません。 – Mathieson

0

私はそれはと同じくらい簡単だと思うだろう:あなたは、あなたのプログラムの中でそれをより多くの時間を使いたい場合、それは多分、カスタムクラスを作成することをお勧めは、能力とのStreamReaderから継承

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("============================================================"); 
     } 
    } 
6

ラインをスキップする。あなたが行をスキップするSkippableStreamReaderの機能を使用することができ、この後

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

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

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

何か。 例:

SkippableStreamReader exampleReader = new SkippableStreamReader("file_to_read"); 

//do stuff 
//and when needed 
exampleReader.SkipLines(number_of_lines_to_skip); 
+0

私はむしろ拡張メソッドを使用したいと思います。 – modiX

3

さらに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ブロックは自動的にクリーンアップします。 Hereは、John Skeetの記事で、その仕組みがどのように正確に機能しているかを詳しく説明しています(「And finally ...」セクションまでスクロールしてください)。

関連する問題