2010-12-21 19 views
5

मैं इन पाठ तुलना करने के लिए एक फ़ोल्डर में 4 पाठ फ़ाइलें और एक pattern.txt है files..In pattern.txt मैंlinq का उपयोग कर दो पाठ फ़ाइलों की तुलना करें?

insert 
update 
delete 
drop 

है मैं उन चार पाठ फ़ाइलों के साथ इस पाठ फ़ाइल की तुलना करने की जरूरत है और इन पैटर्न यदि कोई पंक्ति से मेल खाता मैं एक और लॉग फाइल में उन पंक्तियों के लिखने के लिए है कि पाठ फ़ाइलों में ... मैं उन linq..i का उपयोग करके फ़ाइलें पढ़ा था उन फ़ाइलों की तुलना करने और लाइन number..here के साथ एक पाठ फ़ाइल में लिखने की ज़रूरत मेरी कोड

है
var foldercontent = Directory.GetFiles(pathA) 
        .Select(filename => File.ReadAllText(filename)) 
        .Aggregate(new StringBuilder(), 
        (sb, s) => sb.Append(s).Append(Environment.NewLine), 
        sb => sb.ToString()); 

var pattern = File.ReadAllLines(pathB).Aggregate(new StringBuilder(), 
        (sb, s) => sb.Append(s).Append(Environment.NewLine), 
        sb => sb.ToString()); 

using (var dest = File.AppendText(Path.Combine(_logFolderPath, "log.txt"))) 
      { 
     //dest.WriteLine("LineNo : " + counter.ToString() + " : " + "" + line); 
      } 

संपादित मैं पहले से ही दो पाठ फ़ाइलों की तुलना करने के ग # का इस्तेमाल किया है, लेकिन मैं LINQ में इस जरूरत

while ((line = file.ReadLine()) != null) 
{ 
if (line.IndexOf(line2, StringComparison.CurrentCultureIgnoreCase) != -1) 
{ 
dest.WriteLine("LineNo : " + counter.ToString() + " : " + " " + line.TrimStart()); 
} 
counter++; 
} 
file.BaseStream.Seek(0, SeekOrigin.Begin); 
counter = 1; 
+0

क्या आपको स्टोर करने की आवश्यकता है कि मिलान की गई रेखाएं किस फ़ाइल से आईं? –

+0

@ मैट एलन: मुझे मिलान की गई पंक्तियों को किसी अन्य टेक्स्ट फ़ाइल में स्टोर करने की आवश्यकता है – bala3569

+0

@ bala3569: हां, लेकिन लॉग फ़ाइल में, क्या आपको स्टोर करने की आवश्यकता है कि मेल की गई रेखा किस दूसरी फ़ाइल से आई है? –

उत्तर

4

एक सरल समाधान हो सकती है, लेकिन यह कम से कम काम कर रहा है क्या तुम सच में LINQ उपयोग करना चाहते हैं:

var foldercontent = Directory.GetFiles(pathA) 
        .Select(filename => new 
        { 
         Filename = filename, 
         Lines = File.ReadAllLines(filename) 
        }) 
        .SelectMany(file => file.Lines.Select((line, idx) => new 
        { 
         LineNumber = idx + 1, 
         Text = line, 
         FileName = file.Filename 
        })); 

var pattern = File.ReadAllLines(pathB); 

var result = from fileLine in foldercontent 
      where pattern.Any(p => fileLine.Text.IndexOf(p, StringComparison.CurrentCultureIgnoreCase) != -1) 
      select fileLine; 

foreach (var match in result) 
{ 
    System.Diagnostics.Debug.WriteLine("File: {0} LineNo: {1}: Text: {2}", match.FileName, match.LineNumber, match.Text); 
} 

या यदि आप चाहते हैं, तो आप उस गठजोड़ कर सकते हैं एक LINQ क्वेरी में (लेकिन thats बहुत पठनीय मुझे लगता है कि):

var result = from fileLine in (Directory.GetFiles(pathA) 
        .Select(filename => new 
        { 
         Filename = filename, 
         Lines = File.ReadAllLines(filename) 
        }) 
        .SelectMany(file => file.Lines.Select((line, idx) => new 
        { 
         LineNumber = idx + 1, 
         Text = line, 
         FileName = file.Filename 
        }))) 
       where File.ReadAllLines(pathB).Any(p => fileLine.Text.IndexOf(p, StringComparison.CurrentCultureIgnoreCase) != -1) 
       select fileLine; 
+0

में देख लायक हो सकता है हो सकता है पर शक इस तरह से इसका मतलब है कि एन एन लिख रहे हैं यदि एन मैचों में भिन्न परिणाम 1 = string.Join (",", परिणाम। चयन करें (x => x.ToString())। ToArray()); foreach (परिणाम में var मिलान) {dest.WriteLine (परिणाम 1);} – bala3569

+0

मुझे समझ में नहीं आता कि आपका क्या मतलब है। मेरी LINQ क्वेरी आपको सभी फाइलों की सभी मेल खाने वाली लाइनें देती है। आपको लाइन दोगुनी नहीं मिलेगी। – Jan

+0

या यह सही ढंग से देता है लेकिन मैचों की संख्या के लिए कई बार लिख रहा है – bala3569

4

जब से मैं एक LINQ उत्साही हूँ, और जब यह inappropria है कभी कभी एक उपकरण का उपयोग करेगा ते (मैं gju का उपयोग करने के बारे में @juharr से सहमत हूं या इस स्थिति के लिए कुछ समान) यहां आपके लिए एक संभावित संस्करण है।

static IEnumerable<string> CreateMatchesLog(string patternFilePath, string pathToSearch) 
{ 
    string logTemplate = "File {0}, Line: {1}, Pattern: {2}"; 
    DirectoryInfo di = new DirectoryInfo(pathToSearch); 
    var patternlines = File.ReadAllLines(patternFilePath); 
    var fileslines = di.EnumerateFiles().Select(fi => File.ReadAllLines(fi.FullName).Select((line, i) => new {fi.FullName, line, i})); 

    return from filelines in fileslines 
      from pattern in patternlines 
      from fileline in filelines 
      where fileline.line.Contains(pattern) 
      select String.Format(logTemplate, fileline.FullName, fileline.i + 1, pattern); 
} 

फिर आप इस फ़ंक्शन के आउटपुट को फ़ाइल में लिखेंगे।

using (StreamWriter sw = new StreamWriter("log.txt", true)) 
{ 
    foreach (var log in CreateMatchesLog("pattern.txt", @"c:\test")) 
    { 
     sw.WriteLine(log); 
    } 
} 

मैं StreamWriter में true को संलग्न कर रखा है, क्योंकि मुझे लगता है कि आप फ़ाइल की सामग्री को हर बार जब आप प्रोग्राम चलाने के पास खोने के लिए नहीं करना चाहती।

यह बहुत अक्षम दिखता है (उस पहलू का परीक्षण नहीं किया गया है), लेकिन यह wazoo ऊपर linq और lambdas का उपयोग करता है!

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