2010-01-25 17 views
6
यहाँ

की पहली पंक्ति लंघन # कोड मैंसी एक पाठ फ़ाइल

 using (FileStream fs = new FileStream(filename, FileMode.Open)) 
     using (StreamReader rdr = new StreamReader(fs)) 
     { 
      while (!rdr.EndOfStream) 
      { 
       for (int z = 0; z < 2; z++) 
       { 

        string[] lines = rdr.ReadLine().Split('|'); 
        { 
         sb.AppendLine(";Re"); 
         sb.AppendLine("@C PAMT " + lines[3]); 
         sb.AppendLine("@T " + lines[0]); 
         sb.AppendLine("@D @I\\" + lines[1]).Replace("I:\\", ""); 
         sb.AppendLine(lines[2].Replace(";", "\r\n"); 
        } 
       } 
      } 
     } 

     using (FileStream fs = new FileStream(outputfilename, FileMode.Create)) 
     using (StreamWriter writer = new StreamWriter(fs)) 
     { 
      writer.Write(sb.ToString()); 
     } 

उपयोग कर रहा हूँ सभी मैं चाहता हूँ या तो StreamReader की पहली पंक्ति छोड़ सकते हैं या पूरा पहला stringbuilder छोड़ है। मैंने सोचा कि ऐसा करने के लिए यह होगा लेकिन यह नहीं करता है।

नोट: मैं एक foreach की सलाह देना चाहता हूँ।

+0

आप 'foreach' से क्यों बचना चाहते हैं? –

उत्तर

7

क्यों न केवल पहली पंक्ति पढ़ें और इसके साथ कुछ भी नहीं करें?

using (StreamReader rdr = new StreamReader(fs)) 
{ 
    rdr.ReadLine(); 
    ... 

या यदि आप ऐसा नहीं करना चाहते हैं, मैं और परीक्षण मैं के लिए एक बाहर चर है! = 0

+1

अगर मुझे कुछ याद आ रहा है तो मुझे सही करें, लेकिन यह ठीक है कि जेरेडपार ने कहा कि सिवाय इसके कि यह एक खाली फ़ाइल के मामले को संभाल नहीं पाएगा। –

20

rdr चर बनाने के तुरंत बाद निम्नलिखित पंक्ति क्यों न जोड़ें?

if (!rdr.EndOfStream) {rdr.ReadLine();} 
+0

यह मेरा पहला अनुमान होगा, हां। –

+0

हाँ, लेकिन मुझे यह सभी लाइनों के लिए ऐसा करने की ज़रूरत नहीं है, न कि दूसरी पंक्ति –

3

कैसे

के बारे में
if(z > 0) 
{ 
    // All of your sb.Append stuff 
} 

संपादित करें:

using (FileStream fs = new FileStream(filename, FileMode.Open)) 
using (StreamReader rdr = new StreamReader(fs)) 
{ 
    bool passedFirstline = false; 
    while (!rdr.EndOfStream) 
    { 
     string[] lines = rdr.ReadLine().Split('|'); 
     if(passedFirstLine)      
     { 
      sb.AppendLine(";Re"); 
      sb.AppendLine("@C PAMT " + lines[3]); 
      sb.AppendLine("@T " + lines[0]); 
      sb.AppendLine("@D @I\\" + lines[1]).Replace("I:\\", ""); 
      sb.AppendLine(lines[2].Replace(";", "\r\n"); 
     } 
     else 
     { 
      passedFirstLine = true; 
     } 
    } 
} 

using (FileStream fs = new FileStream(outputfilename, FileMode.Create)) 
using (StreamWriter writer = new StreamWriter(fs)) 
{ 
    writer.Write(sb.ToString()); 
} 
+0

उसका लूप थोड़ी देर के अंदर है ... यह मेरे लिए गलत लगता है - मैं उसका कोड भी संदेह कर रहा हूं। मुझे लगता है कि फ़ाइल त्रुटियों का अंत होगा। – rball

+0

@rball: ठीक है जब तक कि उसके पास 3 से अधिक लाइनें नहीं थीं। तब क्योंकि कुछ भी कभी आरडीआर को आगे नहीं बढ़ाएगा, उसका समय अनंत होगा। मुझे कुछ बेहतर संपादित करने और सुझाव देने दो। –

1

मैं नहीं जानता कि हर किसी कीवर्ड जारी रखने का उपयोग कर के एक प्रशंसक है कि है, लेकिन इस की वजह से लगभग यह है कि मैं तरह के मामलों में पठनीयता आप जारी रखने के लिए निम्न कोड बदल सकते हैं:

string[] lines = rdr.ReadLine().Split('|'); 
{ 
    if (z == 0) continue; // Skip first line 

    sb.AppendLine(";Re"); 
    sb.AppendLine("@C PAMT " + lines[3]); 
    sb.AppendLine("@T " + lines[0]); 
    sb.AppendLine("@D @I\\" + lines[1]).Replace(@"I:\", ""); 
    sb.AppendLine(lines[2].Replace(";", "\r\n"); 
} 
0
using (FileStream fs = new FileStream(filename, FileMode.Open)) 
using (StreamReader rdr = new StreamReader(fs)) { 
    rdr.ReadLine(); // skip the first line 
    string line = null; 
    while ((line = rdr.ReadLine()) != null) { 
    string[] lines = line.Split('|'); 
    sb.AppendLine(";Re"); 
    sb.AppendLine("@C PAMT " + lines[3]); 
    sb.AppendLine("@T " + lines[0]); 
    sb.AppendLine("@D @I\\" + lines[1]).Replace("I:\\", ""); 
    sb.AppendLine(lines[2].Replace(";", "\r\n"); 
    } 
} 

if (sb.Length == 0) return; // return if nothing was processed 

using (FileStream fs = new FileStream(outputfilename, FileMode.Create)) 
using (StreamWriter writer = new StreamWriter(fs)) 
{ 
    writer.Write(sb.ToString()); 
} 
0

आप तो अपने कार्यक्रम में यह अधिक बार उपयोग करने के लिए यह चाहते हैं लाइनर छोड़ने की क्षमता के साथ 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); 
संबंधित मुद्दे