9
votes

Supprimer des lignes en double du fichier texte?

É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.


2 commentaires

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.


5 Réponses :


38
votes

pour petits fichiers: xxx


1 commentaires

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.



22
votes

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


0 commentaires

3
votes

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 //.

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. (

la vaut la peine pour les fichiers assez volumineux cependant.


0 commentaires

3
votes

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. XXX


1 commentaires

Cela nécessite moins de mémoire, mais elle produit également une sortie incorrecte s'il y a une collision de hachage.



1
votes

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


1 commentaires

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.