Filtern und Entfernen von Wortlisten in mehreren Dateien - Tool oder Programm?

0

Ich habe eine Wortliste, die Benutzername, Telefonnummer und E-Mail enthält. Es stammt aus verschiedenen Quellen und ist daher in verschiedenen Größen erhältlich. Ich muss den doppelten Benutzernamen und alle Dinge in einer Reihe filtern.

Bisher habe ich die Methode mit Notepad ++ verwendet. Die Einschränkungen sind jedoch, dass nur jeweils eine Datei ausgefüllt wird. Und es kann keine Dateien wie 500 MB verarbeiten.

Wenn eine Datei den [email protected] hat, bedeutet dies, dass derselbe nicht in einer anderen Datei erscheinen sollte.

In einfacher Weise muss ich das obige Ergebnis mit Notepad ++ für mehrere Dateien erzielen, die HÖHER als 500 MB sind.

Irgendwelche Tools oder Programme? Oder ein effizientes Java- oder C # -Snippet?

Jones
quelle
1
Ich könnte Ihnen ein C # - oder sogar ein PowerShell-Snippet geben (obwohl Ihnen bei 500 MB möglicherweise der Speicher ausgeht), aber möchten Sie die Dateien zu einer kombinieren, oder können Sie auf irgendeine Weise feststellen, welche Datei das Duplikat aufbewahrt? Möglicherweise ist auch ein Programm vorhanden. Wiederum können 500 MB Probleme verursachen.
Bob
@Bob - Wenn es möglich ist, 100 MB große Dateien zu verarbeiten, kann ich die größeren auf 100 aufteilen und verarbeiten. Die erste geladene Datei ist eine Masterdatei und die zweite Datei sollte frei von dem Inhalt der ersten sein.
Jones

Antworten:

0

Hier ist ein C # -Programm, das das tut, was Sie gefragt haben. Ich bin mir nicht 100% sicher, was Sie wollen.

Verwendung ist: program.exe "outputfolder" "file1.txt" "file2.txt" "file3.txt"

Die aufgelisteten Dateien im Ausgabeordner werden in der angegebenen Reihenfolge neu geschrieben. Wenn in einer Zeile oder Datei zuvor ein Benutzername gefunden wurde, wird die Zeile übersprungen. Es werden weder E-Mails noch Telefonnummern überprüft.

using System;
using System.Collections.Generic;
using System.IO;

namespace CreateUniqueFile
{
    class Program
    {
        static void Main(string[] args)
        {
            string fullpath;
            string outpath;
            List<string> files = new List<string>();

            for (int i = 1; i < args.Length; i++)
            {
                fullpath = Path.GetFullPath(args[i]);
                if (!File.Exists(fullpath))
                    Console.WriteLine("File not found: {0}", fullpath);
                else
                {
                    files.Add(fullpath);
                    Console.WriteLine(fullpath);
                }
            }

            if (files.Count == 0)
            {
                Console.WriteLine("No files provided!");
                return;
            }
            else
            {
                outpath = Path.GetFullPath(args[0]);
                Console.WriteLine("Output will go to folder: \"{0}\"", outpath);
                Console.WriteLine("Process files in the above order? (Y/N)");
                bool yes = false;
                while (!yes)
                {
                    switch (Console.ReadKey().Key)
                    {
                        case ConsoleKey.Y:
                            yes = true;
                            break;
                        case ConsoleKey.N:
                            return;
                        default:
                            break;
                    }
                }
            }

            if (!Directory.Exists(outpath))
                Directory.CreateDirectory(outpath);

            HashSet<string> seennames = new HashSet<string>();

            string line, username;

            foreach (string path in files)
            {
                string writepath = outpath + '\\' + Path.GetFileName(path);
                if (File.Exists(writepath))
                {
                    writepath = outpath + '\\' + Path.GetFileNameWithoutExtension(path) + " (2)" + Path.GetExtension(path);
                    // Dodgy thing to increment the number, don't touch!
                    while (File.Exists(writepath))
                    {
                        writepath = writepath.Substring(0, writepath.LastIndexOf('(') + 1) +
                            (Int32.Parse(writepath.Substring(writepath.LastIndexOf('(') + 1, writepath.LastIndexOf(')') - writepath.LastIndexOf('(') - 1)) + 1) +
                            writepath.Substring(writepath.LastIndexOf(')'));
                    }
                }

                using (StreamWriter writer = new StreamWriter(writepath))
                {
                    using (StreamReader reader = new StreamReader(path))
                    {
                        while (!reader.EndOfStream)
                        {
                            line = reader.ReadLine();
                            username = line.Split('-')[0];
                            if (!seennames.Contains(username))
                            {
                                writer.WriteLine(line);
                                seennames.Add(username);
                            }
                        }

                        Console.WriteLine("{0} processed, output to {1}", path, writepath);
                    }
                }
            }
        }
    }
}
Bob
quelle