2010-12-21 34 views
5

tengo 4 archivos de texto en una carpeta y un pattern.txt comparar estos textos files..In pattern.txt tengocomparar dos archivos de texto usando linq?

insert 
update 
delete 
drop 

tengo que comparar este archivo de texto con los cuatro archivos de texto y si estos patrones coincide con cualquier línea en esos archivos de texto tengo que escribir esas líneas en otro archivo de registro ... He leído esos archivos usando linq..i necesito comparar esos archivos y escribir en un archivo de texto con número de línea ... aquí está mi código

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

EDIT ya he utilizado C# para comparar dos archivos de texto pero necesito esto en 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

¿necesita almacenar de qué archivo provienen las líneas coincidentes? –

+0

@Matt Ellen: necesito almacenar las líneas coincidentes en otro archivo de texto – bala3569

+0

@ bala3569: Sí, pero en el archivo de registro, ¿necesita almacenar de qué otro archivo proviene la línea coincidente? –

Respuesta

4

Puede haber una solución más simple, pero esto es por lo menos de trabajo si realmente desea utilizar 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); 
} 

O si lo desea, puede combine en una única consulta LINQ (pero eso no es muy legible creo):

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

Si se lo doy como esto significa que está escribiendo n veces si hay n coincide var result1 = string.Join (",", result.Select (x => x.ToString()). ToArray()); foreach (var coincide en el resultado) {dest.WriteLine (result1);} – bala3569

+0

No entiendo exactamente lo que quiere decir. Mi consulta LINQ le proporciona todas las líneas coincidentes de todos los archivos. No obtendrás líneas duplicadas. – Jan

+0

ya da correctamente pero está escribiendo n número de veces para n número de coincidencias – bala3569

4

Como yo soy un entusiasta de LINQ, y en ocasiones a utilizar una herramienta cuando es inappropria te (estoy de acuerdo con @juharr sobre el uso de grep o algo similar para esta situación) aquí hay una posible versión para ti.

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

Luego debe escribir el resultado de esta función en un archivo.

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

he fijado anexados para true en el StreamWriter, porque supongo que no quiere perder el contenido del archivo cada vez que se ejecuta el programa.

Parece bastante ineficiente (no probado ese aspecto), pero utiliza linq y lambdas hasta el wazoo!

Cuestiones relacionadas