2009-08-07 14 views
6

टेक्स्ट लाइनों की एक इनपुट फ़ाइल को देखते हुए, मैं डुप्लिकेट लाइनों की पहचान और हटा देना चाहता हूं। कृपया सी # का एक सरल स्निपेट दिखाएं जो इसे पूरा करता है।टेक्स्ट फ़ाइल से डुप्लिकेट लाइन्स निकालें?

+0

रहे हैं अपने विचारों को साझा करने के लिए स्वतंत्र भरने जा सकता है।, कुछ आसान लागू करने के लिए दूसरों की तुलना में। लिया जाने वाला दृष्टिकोण टेक्स्ट फ़ाइल के आकार और मिलान लाइनों की अपेक्षित संख्या पर निर्भर कर सकता है। क्या आप उस विशिष्ट समस्या का वर्णन कर सकते हैं जिसे आप हल करने का प्रयास कर रहे हैं? धन्यवाद :) –

+0

। । । और वांछित प्रदर्शन। –

उत्तर

18

यह करना चाहिए (और बड़ी फ़ाइलों के साथ कॉपी जाएगा)।

ध्यान दें कि यह केवल लगातार लाइनों नकल निकाल देता है, यानी

a 
b 
b 
c 
b 
d 

आप कोई डुप्लिकेट कहीं भी चाहते हैं

a 
b 
c 
b 
d 

के रूप में खत्म हो जाएगा, तो आप का एक सेट रखने के लिए की आवश्यकता होगी लाइनें जो आप पहले ही देख चुके हैं।

using System; 
using System.IO; 

class DeDuper 
{ 
    static void Main(string[] args) 
    { 
     if (args.Length != 2) 
     { 
      Console.WriteLine("Usage: DeDuper <input file> <output file>"); 
      return; 
     } 
     using (TextReader reader = File.OpenText(args[0])) 
     using (TextWriter writer = File.CreateText(args[1])) 
     { 
      string currentLine; 
      string lastLine = null; 

      while ((currentLine = reader.ReadLine()) != null) 
      { 
       if (currentLine != lastLine) 
       { 
        writer.WriteLine(currentLine); 
        lastLine = currentLine; 
       } 
      } 
     } 
    } 
} 

ध्यान दें कि यह मान लिया गया है Encoding.UTF8, और है कि आप फ़ाइलों का उपयोग करना चाहते हैं। यह एक विधि है, हालांकि के रूप में सामान्यीकरण करने के लिए आसान है:

static void CopyLinesRemovingConsecutiveDupes 
    (TextReader reader, TextWriter writer) 
{ 
    string currentLine; 
    string lastLine = null; 

    while ((currentLine = reader.ReadLine()) != null) 
    { 
     if (currentLine != lastLine) 
     { 
      writer.WriteLine(currentLine); 
      lastLine = currentLine; 
     } 
    } 
} 

(। ध्यान दें कि कि कुछ भी बंद नहीं होती है - फोन करने वाले है कि क्या करना चाहिए)

यहाँ एक संस्करण है कि सभी डुप्लिकेट निकाल देंगे, बजाय है बस लगातार लोगों को:

static void CopyLinesRemovingAllDupes(TextReader reader, TextWriter writer) 
{ 
    string currentLine; 
    HashSet<string> previousLines = new HashSet<string>(); 

    while ((currentLine = reader.ReadLine()) != null) 
    { 
     // Add returns true if it was actually added, 
     // false if it was already there 
     if (previousLines.Add(currentLine)) 
     { 
      writer.WriteLine(currentLine); 
     } 
    } 
} 
28

छोटे फ़ाइलों के लिए:

string[] lines = File.ReadAllLines("filename.txt"); 
File.WriteAllLines("filename.txt", lines.Distinct().ToArray()); 
+0

मुझे आश्चर्य है कि यह टी [] पर डिस्टिंक() को कैसे संभालता है। – user7116

+0

ऐसा लगता है कि डिस्टिंट एक आंतरिक सेट क्लास का उपयोग करता है जो हैशसेट क्लास के बराबर प्रतीत होता है। बशर्ते 'रेखाएं' बहुत बड़ी नहीं हैं w.r.t. स्मृति यह बहुत अच्छा प्रदर्शन करना चाहिए। – user7116

2

एक लंबे फ़ाइल के लिए (और गैर लगातार दोहराव) मैं एक हैश // स्थिति लुकअप तालिका के निर्माण के रूप में मैं चला गया लाइन द्वारा फ़ाइलों लाइन कॉपी चाहते हैं।

जैसा कि प्रत्येक पंक्ति की प्रतिलिपि बनाई गई है, हैश वैल्यू के लिए चेक करें, अगर टक्कर दो बार जांचें कि लाइन समान है और अगली पर जाएं। (

केवल यह काफी बड़ी फ़ाइलों हालांकि के लिए मूल्य।

2

यहाँ एक स्ट्रीमिंग का दृष्टिकोण है कि स्मृति में सभी अद्वितीय तार पढ़ने की तुलना में कम भूमि के ऊपर उठाना चाहिए।

var sr = new StreamReader(File.OpenRead(@"C:\Temp\in.txt")); 
    var sw = new StreamWriter(File.OpenWrite(@"C:\Temp\out.txt")); 
    var lines = new HashSet<int>(); 
    while (!sr.EndOfStream) 
    { 
     string line = sr.ReadLine(); 
     int hc = line.GetHashCode(); 
     if(lines.Contains(hc)) 
      continue; 

     lines.Add(hc); 
     sw.WriteLine(line); 
    } 
    sw.Flush(); 
    sw.Close(); 
    sr.Close(); 
+1

इसे कम स्मृति की आवश्यकता है, लेकिन यदि हैश टकराव है तो यह गलत आउटपुट भी उत्पन्न करता है। –

0

मैं शुद्ध करने के लिए & है नया हूँ लिखा कुछ अधिक सरल, नहीं बहुत efficient.Please

विभिन्न तरीकों
class Program 
{ 
    static void Main(string[] args) 
    { 
     string[] emp_names = File.ReadAllLines("D:\\Employee Names.txt"); 
     List<string> newemp1 = new List<string>(); 

     for (int i = 0; i < emp_names.Length; i++) 
     { 
      newemp1.Add(emp_names[i]); //passing data to newemp1 from emp_names 
     } 

     for (int i = 0; i < emp_names.Length; i++) 
     { 
      List<string> temp = new List<string>(); 
      int duplicate_count = 0; 

      for (int j = newemp1.Count - 1; j >= 0; j--) 
      { 
       if (emp_names[i] != newemp1[j]) //checking for duplicate records 
        temp.Add(newemp1[j]); 
       else 
       { 
        duplicate_count++; 
        if (duplicate_count == 1) 
         temp.Add(emp_names[i]); 
       } 
      } 
      newemp1 = temp; 
     } 
     string[] newemp = newemp1.ToArray(); //assigning into a string array 
     Array.Sort(newemp); 
     File.WriteAllLines("D:\\Employee Names.txt", newemp); //now writing the data to a text file 
     Console.ReadLine(); 
    } 
} 
+0

एक विचार: यह उपयोगी होगा अगर आप यह समझाने के लिए अपने कोड पर टिप्पणी कर सकते हैं कि आप क्या कर रहे हैं (और क्यों) - इससे दूसरों को आपकी पद्धति को समझने में मदद मिलेगी और भविष्य में इसे अपनी परिस्थितियों में लागू किया जाएगा। –

संबंधित मुद्दे