Форум программистов, компьютерный форум, киберфорум
bedvit
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Быстрая реализация сортировки и удаления дубликатов строк в csv/txt(ANSI) файлах (WinAPI + С++)

Запись от bedvit размещена 03.07.2020 в 16:07
Показов 2913 Комментарии 0
Метки c++, com, vb

Реализация для XLL как функция COM. Реализация в СОМ.
Часть библиотеки BedvitCOM
Сортировка и удаление (опционально) в .txt-файле размером 1Гб, 4 млн. строк. = 3,0 1,6 сек. (файл кеширован)
Потребление памяти: размер файла + (от 4Кб*5 до 16Мб*2) (в зависимости от размера файла, на буферы и сортировку)
Алгоритм оптимизирован на большие файлы. Есть возможность уменьшить еще выделение памяти, но с ущербом для производительности.

Особенности:
1.WinAPI: CreateFile + ReadFile
2.Асинхронность в чтения с диска и выполнения рабочего кода.
3.Возможность отключения системного кеширования.
4.Кодировка csv/txt - ANSI
5.Размер файла ограничен выделяемой памятью (ОЗУ+Файл подкачки)
6.Параллельный алгоритм сортировки concurrency::parallel_buffered_sort
7.Бинарное сравнение символов (strcmp). Возможно в следующей версии добавлю локаль(strcoll). Добавлено.
Бинарное сравнение быстрее в разы, чем сравнение по локальным правилам.
8.Функция возвращает итоговое количество строк записанное в итоговый файл.
9.Поддерживается Стандарт RFC 4180

СОМ функция:
[id(13), helpstring("Sort and Delete Duplicates Rows CSV-file encoded ANSI")]
HRESULT SortDeleteDuplicateRowsCSVansi
([in] BSTR FileIn,
[in] BSTR FileOut,
[in, defaultvalue(0)] LONG HeaderRowsCount,
[in, defaultvalue(0)] LONG OnlySort,
[in, defaultvalue(0)] LONG SortOrder,
[in, defaultvalue(0)] LONG FileFlagNoBuffering,
[in, defaultvalue(0)] LONG SetLocale,
[in, defaultvalue(L"")] BSTR Locale,
[out, retval] LONG* RowsCountOut);

1.FileIn - файл исходный (обязательный)
2.FileOut - файл итоговый (обязательный), может быть = FileIn, данная ситуация обрабатывается правильно (начиная с версии v1.0.2.9)
3.HeaderRowsCount - количество строк заголовка (по умолчанию: 0)
4.OnlySort - только сортировка 0/1 (по умолчанию: 0 - сортировка+удаление дубликатов строк)
5.SortOrder - порядок сортировки 0/1 (по умолчанию: 0 - по возрастанию)
6.FileFlagNoBuffering - отключение системного кеширования чтения/записи файла 0/1 (по умолчанию: 0 - кеширование не отключается)(начиная с версии v1.0.2.9)
Использование в случаях, когда размер файла сравним с размером ОЗУ (не создается доп. буфера файловой системы, за счет чего меньше пишется в файл подкачки и в разы быстрее выполняется код).
7.SetLocale - включить локальные настройки для сортировки 0/1 (по умолчанию: 0 - не включены, бинарное сравнение)
8.Locale - при включенном параметре SetLocale (1), задает локаль (Language tag). (по умолчанию: "" (пусто) - текущей локальные настройки, к примеру для России "ru-RU")
Весь список см. по ссылке:
https://docs.microsoft.com/en-... 1a8b0cdb9c
9.RowsCountOut - Возвращает количество строк в итоговом файле, с учетом количества строк заголовка (возвращаемое значение)

Запуск из VBA
Visual Basic
1
2
3
Sub Test()
Debug.Print CreateObject("BedvitCOM.VBA").SortDeleteDuplicateRowsCSVansi("C:\CSV_1_GB.csv", "C:\CSV_1_GB_out.csv", 0, 1, 0) ' sort file 1Gb
End Sub
С локальными настройками:
Visual Basic
1
2
3
Sub Test()
Debug.Print CreateObject("BedvitCOM.VBA").SortDeleteDuplicateRowsCSVansi("C:\CSV_1_GB.csv", "C:\CSV_1_GB_out.csv", 0, 1, 0, 1, "ru-RU") ' sort file 1Gb Russian
End Sub
Миниатюры
Нажмите на изображение для увеличения
Название: test5.PNG
Просмотров: 642
Размер:	13.4 Кб
ID:	6352  
Метки c++, com, vb
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru