импорт и обработка данных из CSV-файла в Delphi

У меня было предварительное интервью, которое я завершил, и решение работает, однако я был отмечен и не получил интервью из-за использования TADODataset. Я в основном импортировал CSV-файл, который заполнял набор данных, данные должны были обрабатываться определенным образом, поэтому я использовал фильтрацию и сортировку набора данных, чтобы убедиться, что данные были упорядочены так, как я хотел, а затем я сделал логическую обработку в цикле while. Обратная связь, которая была получена сказал, что это было плохо, так как это было бы очень медленно для больших файлов.

мой главный вопрос здесь, Если использование набора данных в памяти медленно для обработки больших файлов, что было бы лучшим способом доступа к информации из файла csv. Должен ли я использовать списки строк или что-то в этом роде?

2 ответов


это действительно зависит от того, насколько "большие" и доступные ресурсы(в данном случае ОЗУ) для задачи.

" обратная связь, которая была получена, сказала, что это плохо, так как это будет очень медленно для больших файлов."

CSV-файлы обычно используются для перемещения данных (в большинстве случаев, с которыми я столкнулся, файлы составляют ~1MB+ до ~10MB, но это не значит, что другие не будут сбрасывать больше данных в формате CSV), не беспокоясь слишком много(если вообще) об импорте/экспорте, так как это очень упрощенно.

Предположим, у вас есть файл CSV 80MB, теперь это файл, который вы хотите обрабатывать кусками, иначе(в зависимости от вашей обработки) вы можете съесть сотни МБ ОЗУ, в этом случае я бы сделал следующее:

while dataToProcess do begin
  // step1
  read <X> lines from file, where <X> is the max number of lines 
  you read in one go, if there are less lines(i.e. you're down to 50 lines and X is 100)
  to process, then you read those
  // step2
  process information
  // step3
  generate output, database inserts, etc.
end;

в приведенном выше случае вы загружаете не 80 МБ данных в ОЗУ, а всего несколько сотен КБ, а остальное вы используете для обработки, т. е. связанные списки, динамические запросы вставки(пакетная вставка) и т. д.

"...однако я был отмечен и сделал не получить интервью из-за использования TADODataset."

Я не удивлен, они, вероятно, искали, можете ли вы создать алгоритм(Ы) и предоставить простые решения на месте, но без использования "готовых" решений.

они, вероятно, думали увидеть, как вы используете динамические массивы и создаете один(или несколько) алгоритмов сортировки.

" должен ли я использовать списки строк или что-то в этом роде?"

ответ может быть было то же самое, опять же, я думаю, что они хотели посмотреть, как вы "работаете".


правильное, масштабируемое и быстрое решение для любого среднего файла вверх-использовать "внешнюю сортировку".

"внешняя сортировка" - это двухэтапный процесс, первый этап-разбить каждый файл на управляемые и отсортированные файлы меньшего размера. Второй этап-объединить эти файлы обратно в один отсортированный файл, который затем может быть обработан строка за строкой.

Он чрезвычайно эффективен в любом CSV-файле с более чем 200,000 русло. Объем памяти, в котором выполняется процесс, можно контролировать, и, таким образом, опасность исчерпания памяти может быть устранена.

я реализовал много таких процессов сортировки и в Delphi рекомендовал бы сочетание классов TStringList, TList и TQueue.

Удачи