Dado un archivo de entrada de líneas de texto, quiero que se identifiquen y eliminen las líneas duplicadas. Muestre un fragmento simple de C# que logre esto.Eliminar líneas duplicadas del archivo de texto?
Respuesta
Esto debería hacer (y copiará con archivos de gran tamaño).
Tenga en cuenta que sólo la quita duplicar líneas consecutivas, es decir
a
b
b
c
b
d
va a terminar como
a
b
c
b
d
Si desea duplicados en cualquier lugar, usted necesita para mantener un conjunto de líneas que ya has visto
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;
}
}
}
}
}
Tenga en cuenta que esto supone Encoding.UTF8
, y que desea utilizar los archivos. Es fácil generalizar como un método sin embargo:
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;
}
}
}
(. Tenga en cuenta que que no cierra nada - la persona que llama debe hacer eso)
Aquí hay una versión que eliminará todos duplicados, en lugar de que se acaban consecutivos:
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);
}
}
}
los archivos pequeños:
string[] lines = File.ReadAllLines("filename.txt");
File.WriteAllLines("filename.txt", lines.Distinct().ToArray());
para un archivo largo (y duplicaciones no consecutivos) que habían copiar archivos de la línea por línea de la construcción de una tabla de búsqueda de hash // posición como fui.
A medida que se copia cada línea, compruebe el valor hash, si hay una colisión, compruebe que la línea sea la misma y pase a la siguiente. (
sólo vale la pena para los archivos bastante grandes sin embargo.
Aquí es un enfoque streaming que debe incurrir en menos gastos generales que la lectura de todas las cadenas únicas en la memoria.
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();
Requiere menos memoria, pero también produce salida incorrecta si hay una colisión hash. –
Soy nuevo a .NET & tienen escrito algo más simple, puede no ser muy eficiente.Por favor, rellene gratis para compartir sus pensamientos.
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();
}
}
Un pensamiento: sería útil si pudieras comentar tu código para explicar lo que estás haciendo (y por qué), eso ayudará a otros a entender tu metodología y aplicarla a sus situaciones en el futuro. –
- 1. Lote para eliminar filas duplicadas del archivo de texto
- 2. ¿Cómo puedo eliminar líneas duplicadas de un archivo?
- 3. Eliminación de líneas duplicadas en un archivo usando Java
- 4. ¿Cómo eliminar filas duplicadas del archivo plano utilizando SSIS?
- 5. eliminar las líneas vacías de archivo de texto con PowerShell
- 6. Lista de C++ eliminar cadenas duplicadas
- 7. Eliminar filas duplicadas (no eliminar todas las duplicadas)
- 8. Eliminar espacio entre líneas de texto
- 9. Comando Linux o script que cuenta líneas duplicadas en un archivo de texto?
- 10. R, eliminar condicionalmente filas duplicadas
- 11. Perl - Encontrar líneas duplicadas en un archivo o matriz
- 12. Cómo eliminar palabras duplicadas de un archivo de texto plano usando comandos de Linux
- 13. Eliminar filas duplicadas de un archivo grande en Python
- 14. Eliminar líneas desde el comienzo del cuadro de texto de líneas múltiples en C#
- 15. Leyendo las últimas líneas del archivo de texto comprimido
- 16. Eliminar líneas del archivo con SED o AWK
- 17. ¿Cómo eliminar las líneas adicionales vacías del archivo XML?
- 18. Archivo por lotes para eliminar las primeras 3 líneas de un archivo de texto
- 19. Python: eliminar entradas duplicadas de CSV
- 20. Eliminar entradas duplicadas usando un script Bash
- 21. Retire las líneas de archivo de texto con el pitón
- 22. Eliminar líneas que contienen la palabra clave de un archivo
- 23. Eliminar las líneas duplicadas en parte por la columna y mantener el último
- 24. Eliminando líneas duplicadas contiguas en vi sin ordenar
- 25. Eliminar cadenas duplicadas en matriz de cadenas
- 26. ¿Cómo eliminar las dos primeras líneas y las últimas cuatro líneas de un archivo de texto con bash?
- 27. ¿Cómo eliminar texto de todas las líneas entre dos columnas?
- 28. Cómo dividir las líneas del archivo de texto de Windows (separación de/r/n)
- 29. Eliminar las primeras líneas X de un archivo PHP
- 30. Etiqueta Alineación del texto con líneas múltiples
Existen varios métodos, algunos más fáciles de implementar que otros. El enfoque que se debe tomar depende del tamaño del archivo de texto y del número esperado de líneas coincidentes. ¿Puedes describir el problema específico que intentas resolver? Gracias :) –
. . . y el rendimiento deseado. –