Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi: Общие вопросы > Быстрая сортировка / Delphi XE4


Автор: Kirilis2018 20.02.18, 17:08
Ребята, здравствуйте. Очень понадобилась ваша помощь.

Нужна быстрая процедура что бы разделить текстовый файл и сохранить в отдельные файлы.

Пример: Имеется файл .txt в 300 000 строк, пример:

3278.Название организации: Atk
231.Род занятий: Строй-фирма
32345.Тип: Подрядчик
87.Название организации: IRK
12218.Род занятий: Ресторан
34543.Тип: Питание

Вопрос: Как разделить этот файл на три текстовых файла что бы:

В первом файле были все строки - (с номером)Название организации: и тут текст
Во втором файле были все строки - (с номером)Род занятий: и тут текст
В третьем файле были все строки - (с номером)Тип: и тут текст

То есть нужно так:

Первый файл:
3278.Название организации: Atk
87.Название организации: IRK

Второй файл:
231.Род занятий: Строй-фирма
12218.Род занятий: Ресторан

Третий файл:
32345.Тип: Подрядчик
34543.Тип: Питание

В тексте постоянно повторяються есть слова: Род занятий, Название организации и Тип. Вот и по ним нужно отсортировать но как ?

Автор: Славян 20.02.18, 18:42
Да не нужно же ничего "сортировать"!
Просто читаем строку и ищем вхождение подстроки "Тип:", или "Название о...:". Найдя=определя нужный тип, записываем строку в соответствующий файл.
Сортировка бы заняла O(n*log(n)), а тут будет быстро=линейно O(n)!

Автор: Kirilis2018 20.02.18, 21:25
Цитата Славян @
Да не нужно же ничего "сортировать"!
Просто читаем строку и ищем вхождение подстроки "Тип:", или "Название о...:". Найдя=определя нужный тип, записываем строку в соответствующий файл.
Сортировка бы заняла O(n*log(n)), а тут будет быстро=линейно O(n)!

А как это сделать ?

Автор: MBo 21.02.18, 00:42
Для чтения и записи файлов можно использовать TStringList
Вхождение образца - с помошью Pos

Автор: Fr0sT 21.02.18, 07:34
Цитата MBo @
Для чтения и записи файлов можно использовать TStringList

Только если памяти хватит на целый файл (а если он в cp1251 - то его двойной размер потребуется).
Легче старый добрый AssignFile + Reset + ReadLn. Либо TStreamReader

Автор: leo 21.02.18, 14:04
Цитата Fr0sT @
Только если памяти хватит на целый файл
Легче старый добрый AssignFile + Reset + ReadLn.

+ SetTextBuf килобайт на 8-32. Иначе терпения не хватит ;)

Автор: Fr0sT 21.02.18, 15:07
А если задача разовая, то можно даже не очень сложным батчем обойтись

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)