Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Обработка больших текстовых файлов: поиск ключей и дополнение значений

Delphi , Базы данных , Сортировка и Фильтр

В данной статье мы рассмотрим вопрос обработки больших текстовых файлов на примере поиска ключей и дополнения значений в файле с помощью языка программирования Pascal (Delphi).

Имеется небольшой текстовый файл, содержащий около 500,000 записей, каждая из которых имеет столбец "ключ". Необходимо найти эти ключи в большом файле (8 ГБ, не менее 219 миллионов записей) и дополнить значение из большого файла в конце строки небольшого файла в качестве нового столбца.

Большой файл имеет следующий вид:

KEY                 VALUE
"WP_000000298.1"    "abc"
"WP_000000304.1"    "xyz"
"WP_000000307.1"    "random"
"WP_000000307.1"    "text"
"WP_000000308.1"    "stuff"
"WP_000000400.1"    "stuffy"

Необходимо выполнить поиск "ключа" в большом файле.

Очевидно, что для быстрого поиска необходимо загрузить весь файл в оперативную память, но это не представляет проблемы, так как имеется 32 ГБ оперативной памяти. Большой файл, скорее всего, уже отсортирован, но это нужно проверить.

Проблема заключается в том, что нельзя выполнить быстрый поиск с помощью, например, TDictionary, так как ключи не уникальны.

Решением данной проблемы может служить использование структуры данных TDynArray, которая позволяет выполнять поиск с помощью бинарного поиска. При этом, если файл уже отсортирован, то время поиска будет линейным по отношению к размеру файла.

Пример кода на Object Pascal (Delphi) для поиска ключа в большом файле с помощью TDynArray:

program SearchKey;

{$APPTYPE CONSOLE}

uses
  System.SysUtils,
  System.Classes;

type
  TEntry = record
    Key: RawUTF8;
    Value: RawUTF8;
  end;

  TEntryDynArray = array of TEntry;

var
  entries: TDynArray<TEntry>;
  entryCount: Integer;
  first, last: Integer;
  key: RawUTF8;

procedure LoadFile(const fileName: string);
var
  i: Integer;
  entry: TEntry;
begin
  entryCount := 0;
  AssignFile(f, fileName);
  ResetFile(f);
  while not Eof(f) do
  begin
    Readln(f, entry.Key, entry.Value);
    Inc(entryCount);
    entries.Add(entry);
  end;
  CloseFile(f);
end;

procedure FindKey(const keyToFind: RawUTF8);
begin
  if entries.FindAllSorted(keyToFind, first, last) then
    Writeln(Format('Found %d occurrences of "%s"', [last - first + 1, keyToFind]))
  else
    Writeln(Format('Did not find "%s"', [keyToFind]));
end;

begin
  LoadFile('bigfile.txt');
  FindKey('WP_000000307.1');
  Readln;
end.

В данном примере мы сначала загружаем большой файл в память с помощью процедуры LoadFile. Затем мы выполняем поиск ключа в файле с помощью процедуры FindKey, которая использует метод FindAllSorted TDynArray для поиска всех вхождений ключа в файле.

Примечание: данный код является примером и может быть доработан в зависимости от конкретной задачи.

В заключение хотелось бы отметить, что при работе с большими текстовыми файлами важно правильно выбрать структуру данных для хранения файла в памяти, а также использовать эффективные алгоритмы поиска. В данной статье мы рассмотрели один из возможных подходов к решению данной задачи с помощью языка программирования Pascal (Delphi).

Создано по материалам из источника по ссылке.

В данной статье описывается задача поиска и дополнения значений в больших текстовых файлах с использованием языка программирования Pascal (Delphi).


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Сортировка и Фильтр ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 03:41:55/0.0052800178527832/1