Étant donné un fichier d'entrée de lignes de texte, je veux que les lignes en double soient identifiées et supprimées. S'il vous plaît montrer un extrait simple de C# qui accomplit cela.Supprimer des lignes en double à partir du fichier texte?
Répondre
Cela devrait faire (et copier des fichiers volumineux).
Notez qu'il supprime uniquement dupliquer consécutifs lignes, à savoir
a
b
b
c
b
d
finira comme
a
b
c
b
d
Si vous voulez pas de doublons partout, vous aurez besoin de garder un ensemble de lignes que vous avez déjà vues.
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;
}
}
}
}
}
Notez que cela suppose Encoding.UTF8
, et que vous voulez utiliser des fichiers. Il est facile de généraliser comme méthode si:
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;
}
}
}
(. Notez que cela ne se ferme pas quoi que ce soit - l'appelant doit faire)
Voici une version qui supprimera tous doublons, plutôt que juste consécutifs:
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);
}
}
}
Pour les petits fichiers:
string[] lines = File.ReadAllLines("filename.txt");
File.WriteAllLines("filename.txt", lines.Distinct().ToArray());
Pour un fichier long (et duplications non consécutifs) je serais copier la ligne de fichiers en ligne la construction d'un hachage // position de table de recherche que je suis allé.
Lorsque chaque ligne est copiée, vérifiez la valeur hachée, s'il y a une double vérification de collision, que la ligne est la même et passe à la suivante. (
ne vaut que pour les fichiers assez grand cependant.
est ici une approche de streaming qui devrait supporter moins de frais généraux que la lecture de toutes les chaînes uniques en mémoire.
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();
Il nécessite moins de mémoire, mais produit également une sortie incorrecte en cas de collision par hachage. –
Je suis nouveau .net & ont écrit quelque chose de plus simple, peut-être pas très efficace.S'il vous plaît remplir gratuitement pour partager vos commentaires
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();
}
}
Une pensée: il serait utile que vous puissiez commenter votre code pour expliquer ce que vous faites (et pourquoi) - cela aidera les autres à comprendre votre méthodologie et à l'appliquer à leurs situations à l'avenir. –
- 1. suppression des lignes en double à partir du fichier/grep
- 2. Supprimer des lignes du fichier
- 3. supprimer les lignes en double
- 4. Unix outil pour supprimer les lignes en double d'un fichier
- 5. Comment puis-je supprimer les lignes en double d'un fichier?
- 6. Suppression de lignes en double dans vi?
- 7. Suppression des lignes en double dans Postgres
- 8. Lire des lignes à partir d'un fichier texte, mais ignorer les deux premières lignes
- 9. Comment supprimer des éléments en double d'un fichier xml?
- 10. Comment supprimer les premières lignes "X" d'un fichier texte?
- 11. caractères de fin de ligne à partir de lignes lues à partir du fichier texte, en utilisant Python
- 12. Comment supprimer des chiffres et du texte à partir de la fin d'une chaîne en Javascript
- 13. Lignes en double dans Oracle
- 14. Automatiser Photoshop pour insérer du texte à partir du fichier
- 15. Comment diviser du texte par des lignes
- 16. Comment supprimer des nœuds XML en double en utilisant XSLT
- 17. Comment supprimer des éléments en double d'un tableau en Perl?
- 18. calculer des valeurs numériques à partir d'un espace séparé fichier texte, dans une plage de lignes
- 19. Lot Supprimer les fichiers à partir du fichier cmd ligne
- 20. Lecture à partir du fichier en eclipse
- 21. Boucle sur les lignes d'un fichier texte en SML/NJ
- 22. Comment lire-écrire dans/à partir du fichier texte avec des valeurs séparées par des virgules
- 23. C#: Supprimer les valeurs en double du dictionnaire?
- 24. Comment supprimer des noeuds en double en utilisant XSLT?
- 25. Comment supprimer le noeud à partir du fichier XML en utilisant C#
- 26. Comment ajouter/Supprimer des lignes de code à un "ThisWorkbook" de fichier Excel en utilisant vb.net?
- 27. Comment lire des données partielles à partir d'un gros fichier texte en C++
- 28. Refactoring des méthodes suivantes pour supprimer le code en double
- 29. Obtenir du texte brut à partir du texte démarqué
- 30. Ajouter des lignes au début du fichier texte, conserver le formatage
Il existe différentes méthodes, certaines plus faciles à mettre en œuvre que d'autres. L'approche à adopter peut dépendre de la taille du fichier texte et du nombre attendu de lignes correspondantes. Pouvez-vous décrire le problème spécifique que vous essayez de résoudre? Merci :) –
. . . et la performance souhaitée. –