0 / 0 / 0
Регистрация: 15.01.2016
Сообщений: 17
1

Сортировка текстового файла

14.01.2017, 11:48. Показов 9826. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите, пожалуйста разобраться.
У меня vs 2015 c#. Необходимо произвести сортировку текстового файла, чтобы строки в нем находились в алфавитном порядке. При сортировке строк, содержащих внутри себя числа, сортировать их в порядке возрастания чисел.
Сие чудо вполне производит все должным образом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
namespace TextSorting
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 1) // если передан путь
            {
                try
                {
                    string[] rows = File.ReadAllLines(args[0]); // загрузить
                    Array.Sort(rows, new NaturalSort()); // отсортировать
                    File.WriteAllLines("res" + args[0], rows); // сохранить
                    Console.WriteLine("Text sorting is successful");
                }
                catch (Exception)
                {
                    Console.WriteLine("Text sorting is unsuccessful");
                }
            }
            else
            {
                return;
            }
            Console.ReadKey(true);
        }
 
        public class NaturalSort : IComparer<string>
        {
            /// <summary>
            /// Функция сравнения строк, с учетом регистра
            /// </summary>
            /// <param name="x"></param>
            /// <param name="y"></param>
            /// <returns></returns>
            public int Compare(string x, string y)
            {
                int ix, iy;
                return IsNumbers(x, out ix) && IsNumbers(y, out iy) ? ix.CompareTo(iy) : 
                    string.Compare(x, y, true, new CultureInfo("en-US")); // сравнить два числа, или сравнить как строки
            }
 
            /// <summary>
            /// Содержит ли строка число (числа). Возвращает также первое найденное число в строке
            /// </summary>
            /// <param name="s"></param>
            /// <param name="i"></param>
            /// <returns></returns>
            private bool IsNumbers(string s, out int i)
            {
                Match match = Regex.Match(s, @"\d+");
                i = match.Success ? Convert.ToInt32(match.Value) : 0;
                return match.Success;
            }
        }
    }
}
ОДНАКО! Если программа в строке встречает первую цифру, то сортирует по ней, но если после первой цифры (спустя буквы) есть еще одна, то она считывает продолжение как обычные "буквы"..
Допустим, мы берем текстовый файл данного вида:


a1bc10def1
a1bc9def1
a1bc40def1
a1bc10dcf1
a1bc10def20
a1bc10def0


то на выходе мы получим точно такой же файл с тем же порядком строк.

Как это исправить?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.01.2017, 11:48
Ответы с готовыми решениями:

Сортировка текстового файла
Нужно отсортировать текстовый файл 88 управление 88 148 менеджмент 74 147 ...

Сортировка текстового файла
Здравствуйте , помогите пожалуйста разобраться. Данный текстовый файл нужно отсортировать прямой...

Сортировка очень большого текстового файла
Всем привет! Перейду сразу к вопросу. Есть очень большой текстовый файл с какими-то данными,...

Сортировка слов текстового файла путём слияния данных из файла и заданного внутреннего массива
Здравствуйте. Имеется задание, которое я ни в коем случае не прошу за меня сделать. Мне...

11
Администратор
Эксперт .NET
16992 / 13350 / 5211
Регистрация: 17.03.2014
Сообщений: 27,302
Записей в блоге: 1
14.01.2017, 14:40 2
AlisaChoi, ты делаешь сравнение только первой части, а нужно сравнивать все по очереди.
0
0 / 0 / 0
Регистрация: 15.01.2016
Сообщений: 17
14.01.2017, 18:34  [ТС] 3
Цитата Сообщение от OwenGlendower Посмотреть сообщение
AlisaChoi, ты делаешь сравнение только первой части, а нужно сравнивать все по очереди.
а как это исправить?...
0
Администратор
Эксперт .NET
16992 / 13350 / 5211
Регистрация: 17.03.2014
Сообщений: 27,302
Записей в блоге: 1
14.01.2017, 18:59 4
AlisaChoi, тебя интересует описание алгоритма (чтобы решить самостоятельно) или готовое решение?
0
0 / 0 / 0
Регистрация: 15.01.2016
Сообщений: 17
14.01.2017, 20:38  [ТС] 5
Цитата Сообщение от OwenGlendower Посмотреть сообщение
интересует описание алгоритма (чтобы решить самостоятельно) или готовое решение?
хотелось бы осознать самой как это делается, а также если по ходу разбирательств у меня возникнут вопросы - вы сможете помочь? если нет времени на это все, то тогда решение..
по мне как-то совсем нагло просить писать программу..(
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
14.01.2017, 21:09 6
AlisaChoi, вы сформулируйте полностью как должно производиться сравнение. Из примера в разделе "ОДНАКО!" понятно только то, что вас эта сортировка не устраивает. А какая нужна - непонятно. Надо бы разъяснения по вопросам типа "как сравнивать строки с несколькими числами, как сравнивать строки с разным количеством чисел и тд".
1
0 / 0 / 0
Регистрация: 15.01.2016
Сообщений: 17
14.01.2017, 21:28  [ТС] 7
Цитата Сообщение от TopLayer Посмотреть сообщение
сформулируйте полностью как должно производиться сравнение
Само задание звучит так: "Произвести сортировку текстового файла (сортировать строки текстового файла в алфавитном порядке, для сравнения строк реализовать функцию, не учитывающую регистр символов, размер файла до 10^8 символов, число строк не менее 10^5). При сортировке строк, содержащих числа внутри себя числа, сортировать их в порядке возрастания чисел."

Рассматривая пример из "ОДНАКО", получаем:

a1bc10def1
a1bc9def1
a1bc40def1
a1bc10dcf1
a1bc10def20
a1bc10def0


А нужно:

a1bc9def1
a1bc10dcf1
a1bc10def0
a1bc10def1
a1bc10def20
a1bc40def1



Т.е. необходимо, чтобы программа сначала сортировала по первым цифрам что нашла, и также продолжала делать в дальнейшем, если встречает в строке цифру.
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
14.01.2017, 22:21 8
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class NaturalSort : IComparer<string>
{
    /// <summary>
    /// Функция сравнения строк, БЕЗ учетом регистра
    /// </summary>
    /// <param name="x"></param>
    /// <param name="y"></param>
    /// <returns></returns>
    public int Compare(string x, string y)
    {
        var xNumbers = GetNumbers(x);
        var yNumbers = GetNumbers(y);
 
        if (!xNumbers.Any() && !yNumbers.Any())
        {
            return string.Compare(x, y, StringComparison.CurrentCultureIgnoreCase);
        }
 
        return CompareSequences(xNumbers, yNumbers);
    }
 
    private int CompareSequences(IEnumerable<int> x, IEnumerable<int> y)
    {
        using (var left = x.GetEnumerator())
        using (var right = y.GetEnumerator())
        {
            bool leftInProcess, rightInProcess;
            while ((leftInProcess = left.MoveNext()) & (rightInProcess = right.MoveNext()))
            {
                if (left.Current != right.Current)
                {
                    return left.Current.CompareTo(right.Current);
                }
            }
 
            if (leftInProcess == rightInProcess)
            {
                return 0;
            }
            
            return leftInProcess ? -1 : 1;
        }
    }
    
    private IEnumerable<int> GetNumbers(string line)
    {
        return Regex.Matches(line, @"[+-]?\d+").Cast<Match>().Select(m => int.Parse(m.Value));
    }
}
1
Администратор
Эксперт .NET
16992 / 13350 / 5211
Регистрация: 17.03.2014
Сообщений: 27,302
Записей в блоге: 1
14.01.2017, 22:23 9
Лучший ответ Сообщение было отмечено AlisaChoi как решение

Решение

Раз дело дошло до реализаций, то я бы скорее так сделал
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class NaturalSort : IComparer<string>
{
    public int Compare(string x, string y)
    {
        if (string.Equals(x,y)) return 0;
        
        int len = Math.Min(x.Length, y.Length), i=0, j=0;
        for (; i<len && j<len;)
        {
            int ii=i+1, jj=j+1;
            bool dx = char.IsDigit(x[i]), dy = char.IsDigit(y[j]);
            if (dx && dy)
            {
                while (ii<x.Length && char.IsDigit(x[ii])) ii++;
                while (jj<y.Length && char.IsDigit(y[jj])) jj++;
                
                int n1 = int.Parse(x.Substring(i, ii-i));
                int n2 = int.Parse(y.Substring(j, jj-j));
                if (n1 < n2) return -1;
                if (n1 > n2) return 1;
            }
            else
            {
                while (ii<x.Length && dx == char.IsDigit(x[ii])) ii++;
                while (jj<y.Length && dy == char.IsDigit(y[jj])) jj++;
                
                int result = string.Compare(x, i, y, j, Math.Max(ii-i, jj-j));
                if (result != 0) return result;
            }
            i=ii; j=jj;
        }
        if (i == x.Length && j < y.Length) return -1;
        if (i < x.Length && j == y.Length) return 1;
        return 0;
    }
}
3
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
14.01.2017, 22:27 10
А нет. Ошибся.

Добавлено через 1 минуту
Цитата Сообщение от AlisaChoi Посмотреть сообщение
Т.е. необходимо, чтобы программа сначала сортировала по первым цифрам что нашла, и также продолжала делать в дальнейшем, если встречает в строке цифру.
Тогда почему эти строки в таком порядке?
Цитата Сообщение от AlisaChoi Посмотреть сообщение
a1bc10dcf1
a1bc10def0
Добавлено через 1 минуту
И кстати вы цифры с числами не путаете?
0
0 / 0 / 0
Регистрация: 15.01.2016
Сообщений: 17
15.01.2017, 09:44  [ТС] 11
Цитата Сообщение от TopLayer Посмотреть сообщение
Тогда почему эти строки в таком порядке?
потому что в данных строчках до d все идет идентично, а потом в верхней строчке c, а в нижней e. Так как c идет перед e, поэтому первая строчка сверху..
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
19.01.2017, 11:15 12
AlisaChoi, я согласен с TopLayer, в том, что задание отсутствует:
Цитата Сообщение от AlisaChoi Посмотреть сообщение
При сортировке строк, содержащих внутри себя числа, сортировать их в порядке возрастания чисел.
Посмотрим по порядку:
Цитата Сообщение от AlisaChoi Посмотреть сообщение
При сортировке строк,
-пустая трата слов, так как бессодержательно. Можно было бы, например:
При посимвольном равенстве до встречи чисел, большей считается строка с большим числом. Почему не "до встречи цифр..."? Потому что при посимвольном сравнении код большей цифры больше кода меньшей и без оговорок. Поэтому "посимвольное и без учёта регистра", сравнение перекрывает подобное уточнение.
Но если таки чисел:
Цитата Сообщение от AlisaChoi Посмотреть сообщение
сортировать их в порядке возрастания чисел.
И неважно когда и как где встречены числа, то может оказаться, что строка:
zzzz9
меньше строки
a11
потому что обе строки встречены "При сортировке строк" и обе соответствуют критерию "содержащих внутри себя числа" и побеждает условие 11 > 9.
AlisaChoi, если Вы верно отразили условие, то тот кто его придумал, "встречается при сортировке" и "содержит внутри себя числа" и ещё кое-что (imho).
Или я сам ничего не понял.
0
19.01.2017, 11:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.01.2017, 11:15
Помогаю со студенческими работами здесь

сортировка текстового файла
Ребят, помогите составить процедуру сортировки строк текстового файла по последнему слову строки и...

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

Сортировка текстового файла
Здравствуйте! Есть текстовый файл такого вида: &lt;Глава Первая&gt; орор валовыло валорлвоы &lt;Конец...

Сортировка текстового файла
Крошка сын к отцу пришел... а точнее дочка- первокурсница, с просьбой - Папа, помоги! Ну, папа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru