Сортировка текста в тхт файле по алфавиту

323
27 июня 2017, 21:20

В тхт файле есть строки типа :

294|ab
124h|b4 
903|ac 
626|ad 
2364|ag 
913a|it 
390q|a8

есть строка по которой надо сортировать, то есть string digits="abcdefghijklmnopqrstuvwxyz0123456789"; но как сделать чтобы строки в тхт сортировались по алфавиту "digits", но после | значка. Если меняется порядок чисел значит меняется и то что до "|" знака...если эти числа после | повторяются, значит они идут подряд..после сортировки должно быть так:

294|ab
903|ac 
626|ad 
2364|ag
390q|a8
124h|b4 
913a|it 

после | знака будет строка, длинна все равно какая, надо все что находится после | сортировать по алфавиту

Answer 1

Сначала создадим класс:

class Line
{
    public string Text { get; set; }
    public string Fragment { get; set; }
}

и функцию:

private string getFragment(string s,string digits)
{           
    if (string.IsNullOrEmpty(s))
        return string.Empty;
    var t = s.Split('|');
    if (t.Count() == 1)
        return string.Empty;
    s = t[t.Count() - 1];
    for (int i = 0; i < digits.Length; i++)
    {
        s = s.Replace(digits[i], (char)i);
    }
    return s;
}

Функция берет текст после "|" и меняет для сортировки по digits. После этого по клику на буттон:

private void Button1_Click(object sender, EventArgs e)
{
    string digits = "0123456789";
    var list = new List<Line>();
    var lines = File.ReadAllLines("filename");
    foreach (var s in lines)
    {                
        list.Add(new Line { Text = s, Fragment = getFragment(s,digits) });
    }
    lines = list.OrderBy(r => r.Fragment).Select(x => x.Text).ToArray();
    File.WriteAllLines("filename", lines);
}

Если просто сортироват по альфавиту, можно так:

class Line
{
    public string Text { get; set; }
    public string Fragment
    {
        get
        {
            if (Text.Contains("|"))
                return Text.Split('|')[1];
            else return string.Empty;
        }
    }
}
var list = new List<Line>();
var lines = File.ReadAllLines("filename");
foreach (var s in lines)
{                
    list.Add(new Line { Text = s});
}
lines = list.OrderBy(r => r.Fragment, StringComparer.OrdinalIgnoreCase).Select(x => x.Text).ToArray();
File.WriteAllLines("filename", lines); 
Answer 2

В общем, подход, описанный koshe - создание класса-модели - является правильным.

Но если данные из файла нигде более не используются и вся задача сводится только к его сортировке, то можно сделать так:

var lines = File.ReadAllLines("test.txt");
var sorted = lines.OrderBy(line => int.Parse(line.Split('|')[1]));
File.WriteAllLines("test2.txt", sorted);
READ ALSO
Сценарий обработки запросов в Telegram Bot c#

Сценарий обработки запросов в Telegram Bot c#

Как в Telegram bot обрабатывать команды?

240
Произведение матриц [требует правки]

Произведение матриц [требует правки]

Не могу решить умножение матриц через форму, то есть надо задать размер двух матриц так же через форму, умножить и вывести на экран

190
Использование KeepAlive опции для потоковых TCP сокетов

Использование KeepAlive опции для потоковых TCP сокетов

Для установки KeepAlive опции я использую метод socketIOControl:

233