Сортировка текcтового файла и вывод результата сортировки в новый файл C#

135
26 августа 2019, 08:00

Есть текстовый файл с именами , кличками и фамилиями. Каждое имя, фамилия, отчество начинаются с новой строки. Нужно создать новый текстовый файл где все эти люди должны быть отсортированны по имени или по фамилии или по отчеству или по кличке. Притом у некоторых людей могут быть не только одна кличка. Пример "Вася Корж Кисель Петров \t" Андрей Хмурый Иванов ". При сортировке по фамилии на первой строке нового текстового файла должен быть Андрей затем Вася. При этом порядок слов в строке не должен менаться

Console.WriteLine("Choose sorting method of customers: 1. for Last name 2. for first given name");
string inFile = @"/unsort-customers.txt";
string outFile = @"/sort-costumers.txt";
string booferFile =@"/boofer.txt" ;
var contents = File.ReadAllLines(inFile);
foreach (var item in contents)
{
    string[] names = item.Split(' ');
    string name = names.First();
    string surname = names.Last();
    string klichka1 = names[1];
    string klichka = names[2];

    using (StreamWriter file = new StreamWriter(booferFile, true))
    {
        if (chooseButton == "1")
        {
            file.WriteLine((name + " " + surname).Trim());
        }
        else if (chooseButton == "2")
        {
            file.WriteLine((klichka1 + " " + name + " " 
surname).Trim());
        }
        else if (chooseButton != "1" || chooseButton != "2" ) 
        {
            Console.WriteLine("Error");
            break;
        }
    }
}
Answer 1

Наперед: код писать умышленно не буду.

Код слишком простой и должен быть реализован тобой самим. Но распишу алгоритм.

  1. Создай класс Human который отвечает за человека. (имя, фамилия, кличка1, кличка2, кличка3 и что там еще у тебя может быть). В этом же классе должен быть метод заполнения со строки ( FromString(string str)) и метод преобразования инстанса в строку -- переопределенный ToString()
  2. построчно считай файл генеря список людей List<Human>
  3. При помощи LINQ отсортируй список по нужной проперти OrderBy(x=>x....)
  4. Сохрани список в файл используя Stream и AppendLine метод используя все тот же метод ToString() у каждого из людей

    public FromString(string str)
    {
        string[] arr = str.Split(' ');
        FirstName = GetFromIndexIfExist(arr, 0); //то есть положение слова в строке из оригинального файла
        LastName = GetFromIndexIfExist(arr, 1);
        FictionName1 = GetFromIndexIfExist(arr, 2);
        FictionName2 = GetFromIndexIfExist(arr, 3);
        FictionName3 = GetFromIndexIfExist(arr, 4);
    }
    public override string ToString() =>
        $"{FirstName} {LastName} {FictionName1} {FictionName2} {FictionName3}"; 
        //то есть та последовательность, которая у тебя в оригинале файла
    private string GetFromIndexIfExist(string[] arr, index) =>
        (arr.Count() >= index) ? arr[index] : string.Empty;
    
Answer 2

все же добавлю свой вариант

 // опускаем построчное чтение файла (отчества тут тоже нет :))
        var lines = new List<string> {
            "Вася Пупкин Васёк Квас",
            "Архимед Эвриков Эврик"
        };

        var orderedList = lines
            .Select(line =>
            {
                // далее нет необходимых проверок, хотя по хорошему они должны быть:
                // - существование нужного индекса
                // - очистка результатов
                var temp = line.Split(' ');
                var otherNames = temp.Skip(2).ToList();    
                return new
                {
                    InitialStr = line,
                    FirstName = temp[0],
                    LastName = temp[1],
                    OtherNames = otherNames,
                    // выбираем кличку прямой сортировкой
                    ONameAsc = otherNames.OrderBy(n => n).FirstOrDefault() ?? string.Empty,
                    // выбираем кличку обратной сортировкой
                    ONameDesc = otherNames.OrderByDescending(n => n).FirstOrDefault() ?? string.Empty
                };
            })
            //.OrderBy(it => it.LastName)
            //.OrderByDescending(it => it.FirstName)
            //.OrderBy(it => it.ONameAsc)
            .OrderByDescending(it => it.ONameDesc)
            .Select(it=> it.InitialStr)
            .ToList();
        // осталось записать результат в файл
Answer 3

Проще всего, наверное, вначале преобразовать текстовый файл в файл базы данных. Например,если, каждая запись начинается с новой строки, считать файл построчно, потом каждую строку распарсить, а результат добавить в БД. После этого вам будет доступна вся мощь СУБД. Обратное преобразование (БД-файл) производится элементарно...

READ ALSO
Работа с пулом gprs модемов

Работа с пулом gprs модемов

Имеется пул gprs модемов, подключенных к COM - портамСписок клиентов, с которыми должны связываться модемы, гораздо больше количества модемов

116
Помогите разобраться с принтером Argox

Помогите разобраться с принтером Argox

Для печати на принтере Argox, подключенном к USB-порту использую команду

114
Как достать строку из локализации OS?

Как достать строку из локализации OS?

В операционной системе есть куча текста который можно локализироватьДопустим, мне нужно узнать как называется окно "Save As" в локализации на даном...

143
Как изменить путь к БД в C#

Как изменить путь к БД в C#

Работаю над проектом в Visual Studio C#В проекте есть несколько форм и в каждом из них я использую oledbconnection и oledbadapter для подключения БД

126