2010-12-11 35 views
14

Tôi có một chương trình đọc một tệp văn bản và xử lý nó để được phân tách thành các phần.C# Làm thế nào để bỏ qua số dòng trong khi đọc tệp văn bản bằng Trình đọc luồng?

Câu hỏi đặt ra là chương trình có thể được thay đổi như thế nào để cho phép chương trình bỏ qua đọc 5 dòng đầu tiên của tệp trong khi sử dụng Trình đọc luồng để đọc tệp?

Có thể ai đó vui lòng tư vấn về mã không? Cảm ơn!

Các Codes:

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

vậy vấn đề với việc sử dụng nhận xét ngoài dòng là gì? –

+0

Nó cho thấy các chuyên gia rằng phương pháp .split không hoạt động. – JavaNoob

+0

có thể trùng lặp của [C# Cách bỏ qua các dòng trong tệp Văn bản sau khi văn bản được chuyển thành mảng?] (Http://stackoverflow.com/questions/4417916/c-how-to-skip-lines-in-text-file-after -text-coverted-to-array) – ChrisF

Trả lời

22

hãy thử như sau

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

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

Cảm ơn nó hoạt động độc đáo! – JavaNoob

8

Nếu các dòng được cố định sau đó là cách hiệu quả nhất là như sau:

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

Và nếu các dòng khác nhau chiều dài sau đó bạn sẽ phải chỉ đọc chúng trong một dòng tại một thời điểm như sau:

using (var sr = new StreamReader("file")) 
{ 
    for (int i = 1; i <= 5; ++i) 
     sr.ReadLine(); 
} 
+2

Chỉ cần một lưu ý, không giống như các giải pháp khác ở đây điều này sẽ không bận tâm đọc các dòng bạn đang bỏ qua, và nên được nhanh hơn nhiều so với những người khác. – Mathieson

0

tôi đoán nó đơn giản như:

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

Nếu bạn muốn sử dụng nó nhiều lần trong chương trình của bạn sau đó nó có thể là một ý tưởng tốt để tạo ra một lớp tùy chỉnh được thừa kế từ StreamReader với khả năng để bỏ qua các dòng.

Something như thế này có thể làm:

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

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

sau này bạn có thể sử dụng chức năng của SkippableStreamReader để bỏ qua dòng. Ví dụ:

SkippableStreamReader exampleReader = new SkippableStreamReader("file_to_read"); 

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

Tôi thà sử dụng một phương pháp mở rộng. – modiX

3

Tôi sẽ thêm hai đề xuất khác vào danh sách.

Nếu sẽ luôn có một tập tin, và bạn sẽ chỉ được đọc, tôi đề nghị này:

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

File.ReadLines không chặn các tập tin từ những người khác và chỉ tải vào dòng cần thiết bộ nhớ.

Nếu luồng của mình có thể đến từ các nguồn khác sau đó tôi đề nghị phương pháp này:

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

Khối Iterator sẽ tự động làm sạch bản thân lên một khi bạn đang thực hiện với nó. Here là một bài viết của Jon Skeet đi sâu vào cách hoạt động chính xác (cuộn xuống phần "Và cuối cùng ...").

Các vấn đề liên quan