2016-04-09 15 views

cevap

0

Yazdırılacak bir şey bulduğunuzu ve bir sonraki satırı yazdırmanız gerektiğini gösteren bir boolean kullanmayı deneyin.örneğin:

class Program 
{ 
    static void Main(string[] args) 
    { 
     bool nextLineToPrint = false; 
     using (StreamReader sr = new StreamReader("c:/temp/ESMDLOG.csv")) 
     { 
      string currentLine; 
      // currentLine will be null when the StreamReader reaches the end of file 
      while ((currentLine = sr.ReadLine()) != null) 
      { 
       if (nextLineToPrint) 
       { 
        Console.WriteLine(currentLine); 
        nextLineToPrint = false; 
       } 
       // Search, case insensitive, if the currentLine contains the searched keyword 
       if (currentLine.IndexOf("I/RPTGEN", StringComparison.CurrentCultureIgnoreCase) >= 0) 
       { 
        Console.WriteLine(currentLine); 
        nextLineToPrint = true; 
       } 
      } 
     } 
     Console.ReadLine(); 
    } 
} 
+0

bunu çalıştı;) – tedder84

0

'Geçerli satırın' yazdırıldığını belirten bir boolean kullanmayı deneyebilir, sonra bir sonraki satır yazdırıldıktan sonra döngüden çıkabilirsiniz. Bu şekilde sadece currentLine basılmaz, aynı zamanda bir sonraki satır, sonra while-loop'u çıkar.

using (StreamReader sr = new StreamReader("c:/temp/ESMDLOG.csv")) 
{ 
    string currentLine; 
    **bool lastline = false;** 

    // currentLine will be null when the StreamReader reaches the end of file 
    while((currentLine = sr.ReadLine()) != null) 
    { 
     // Search, case insensitive, if the currentLine contains the searched keyword 
     if(currentLine.IndexOf("I/RPTGEN", StringComparison.CurrentCultureIgnoreCase) >= 0 **|| lastline**) 
     { 
      Console.WriteLine(currentLine); 
      lastline = true; 
     } 

     **//Optional, could also say lastline = false inside if, in case you want to keep looping after printing** 
     **if(lastline){ 
       break; 
     }** 
    } 
} 
+0

Yapmak istediğim şey budur. Ve currentLine ve lastLine'ı yazdırdıktan sonra dönmelidir. Her neyse işe yaramadı. – tedder84

0

Daha kesin bir sorun bildirimi olmadan, istediğiniz çıktıyı bilmek mümkün değildir. Yukarıda bir window koleksiyonunu korur: (tarayıcı okunur Yukarıdaki kod yazım hataları ve diğer oversights affet uyarı..)

using (StreamReader sr = new StreamReader("c:/temp/ESMDLOG.csv")) 
{ 
    bool printWindow = false; 
    Queue<string> window = new Queue<string>(); 
    string currentLine; 
    // currentLine will be null when the StreamReader reaches the end of file 
    while((currentLine = sr.ReadLine()) != null) 
    { 
     bool nextPrintWindow = false 

     // Search, case insensitive, if the currentLine contains the searched keyword 
     if(currentLine.IndexOf("I/RPTGEN", StringComparison.CurrentCultureIgnoreCase) >= 0) 
     { 
      nextPrintWindow = true; 
     } 

     if (window.Count >= 3) 
     { 
      window.Dequeue(); 
     } 

     window.Enqueue(currentLine); 

     if (printWindow) 
     { 
      Console.WriteLine(string.Join(Environment.NewLine, window)); 
     } 

     printWindow = nextPrintWindow; 
    } 
} 

: Ama aşağıdaki gibi bir şey şimdiye kadar kısıtlı olarak hedefe buluşacak Örneğin, mevcut satırın yerleştirilmesiyle dosyadaki metnin üç satırlı bir "penceresi" ve toplama üç öğe sayısına ulaşırsa en eski çizgiyi deşarj etme.

Aynı zamanda, sonraki satırı okuduktan sonra pencerenin içeriğinin yazdırılıp yazdırılmayacağını belirten bir bayrak korur. Bu bayrak true olarak ayarlanmışsa, window koleksiyonundaki satırları satırsonu karakterleriyle birleştirir ve her şeyi yazdırır.

Bu şekilde, geçerli satır eşleşme ölçütlerinizi karşılarsa, önceki ve sonraki satırlarla birlikte geçerli satır yazdırılır.

Yukarıdakilerin her eşleşme için üç satırlı pencereleri yazdıracağını unutmayın. Örneğin ardışık çizgiler eşleşme kriterlerini karşılarsa, hatlar birden fazla kez (farklı üç satırlı grupların bir parçası olarak) yazdırılabilir. Alternatif bir uygulama, ardışık çizgiler eşleşme ölçütlerini karşılarsa pencerenin üç öğenin ötesine geçmesine izin verir, pencereyi yalnızca eşleşme ölçütlerini karşılamayan bir satır okunduğunda yazdırılır (ve yeniden başlatılır). Başka bir alternatif, pencereyi yazdırmadan önce, yani eşleşme olmayan çizgilerin bile yalnızca bir kez basıldığından emin olmak istiyorsanız, iki eşleşmeyen çizgileri gerektirebilir.

Bu varyasyonu okuyucu için bir egzersiz olarak bırakıyorum. Yukarıdakilerden çok farklı olmayacaklar, pencerenin bakımındaki küçük değişiklikler ve bayrak değişkenlerinde kapsanan zımni durum makinesinin yönetimi.

+0

Daha kesin bir sorun bildirimi yapmaya çalıştım. – tedder84

+0

Soruyu tamamen değiştirdiniz. Artık, daha önce, sonra ve bulduğunuz çizgiyi dahil etmeden satırı yazdırmayı istemiyorsunuz. Gerçekten farklı bir soru sormak isterseniz, lütfen mevcut bir soruyu değiştirmek yerine yeni bir soru olarak gönderin. Yeni bir soru sormak istemiyorsanız, soruyu değiştirmeyin. Her iki durumda da, düzenlemenizi geri çekerek orijinal sorunuzun devam etmesini sağlayın. Sorunun değiştirilmesinin mevcut cevapları geçersiz kıldığını ve herkesin zamanını harcadığını unutmayın. –

İlgili konular