У меня есть список слов, который содержит имя пользователя, номер телефона и адрес электронной почты. Он собран из разных источников, поэтому в разных размерах. Мне нужно отфильтровать повторяющееся имя пользователя и все подряд.

До сих пор я использовал метод с использованием Notepad++. Но ограничения заключаются в том, что он заполняет фильтр только одним файлом за раз. И он не может обрабатывать файлы, такие как 500 МБ.

так что если файл имеет username-useremail@example.com-someIntegerPhoneNumber, это означает, что то же самое не должно появляться в другом файле.

Проще говоря, мне нужно добиться результата выше с помощью Notepad++ для нескольких файлов, которые ВЫШЕ, чем 500 МБ.

Какие-нибудь инструменты или программы? Или какой-нибудь эффективный фрагмент кода Java или C #?

1 ответ1

0

Вот программа на C #, которая делает что-то вроде того, что вы просили. Я на самом деле не на 100% уверен, что вы хотите.

Использование: program.exe "outputfolder" "file1.txt" "file2.txt" "file3.txt"

Переписывает перечисленные файлы в выходную папку, обрабатываются в указанном порядке. Если имя пользователя встречалось в какой-либо строке или файле ранее, оно пропустит строку. Он не проверяет электронную почту или номер телефона в любом случае.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .