Étant donné un fichier d'entrée de lignes de texte, je veux être identifié et supprimé des lignes en double. S'il vous plaît montrer un simple extrait de C # qui l'accomplit. P>
5 Réponses :
pour petits fichiers:
On dirait que des utilisations distinctes d'une classe de jeu interne qui semble être une classe de hashsette parfaite. Fourni des «lignes» n'est pas terriblement grosse w.r.t. mémoire cela devrait fonctionner très bien.
Ceci devrait faire (et copierez-la avec des fichiers volumineux).
Notez qu'il supprime uniquement les lignes Duplicata consécutives EM>, c'est-à-dire P> 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 un fichier long (et des doublons non consécutifs), je copierais la ligne de fichiers par ligne à la construction d'une table de recherche de hachage //. p>
Comme chaque ligne est copiée, vérifiez la valeur hachée, s'il y a une double collision, vérifiez que la ligne est identique et passez à la suivante. ( p>
la vaut la peine pour les fichiers assez volumineux cependant. p>
Voici une approche de streaming qui devrait inciter moins de frais généraux que de lire toutes les chaînes uniques en mémoire.
Cela nécessite moins de mémoire, mais elle produit également une sortie incorrecte s'il y a une collision de hachage.
Je suis nouveau à .net et j'ai écrit quelque chose de plus simple, peut ne pas être très efficace.Veuillez remplir gratuitement de partager vos pensées.
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: ce serait utile si vous pouviez 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.
Il existe différentes méthodes, plus faciles à mettre en œuvre que d'autres. L'approche à prendre peut dépendre de la taille du fichier texte et du nombre prévu de lignes de correspondance. Pouvez-vous décrire le problème spécifique que vous essayez de résoudre? Merci :)
. . . et la performance souhaitée.