从Delphi中的CSV文件导入和处理数据

Mat*_*tgb 7 delphi delphi-2010

我有一个预先面试的任务,我已经完成并且解决方案有效,但是由于使用了TADODataset,我被标记了并没有接受采访.我基本上导入了一个填充数据集的CSV文件,数据必须以特定的方式处理,所以我使用数据集的过滤和排序来确保数据按我想要的方式排序然后我做了while循环中的逻辑处理.收到的反馈说这很糟糕,因为对于大文件来说这会很慢.

我的主要问题是,如果使用内存数据集处理大型文件的速度很慢,那么从csv文件访问信息的方法就更好了.我应该使用字符串列表还是类似的东西?

小智 5

这实际上取决于任务的“大”和可用资源(在这种情况下为 RAM)。

“收到的反馈说这很糟糕,因为它对于大文件来说会很慢。”

CSV 文件通常用于移动数据(在大多数情况下,我遇到的文件是 ~1MB+ 到 ~10MB,但这并不是说其他​​人不会以 CSV 格式转储更多数据)而不必担心(如果在all)关于导入/导出,因为它非常简单。

假设你有一个 80MB 的 CSV 文件,现在这是一个你想要分块处理的文件,否则(取决于你的处理)你可以吃数百 MB 的 RAM,在这种情况下我会做的是:

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;
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,你没有将 80MB 的数据加载到 RAM 中,而是只有几百 KB,其余的用于处理,即链表、动态插入查询(批量插入)等。

“……然而,由于使用了 TADODataset,我被降级并没有得到面试。”

我并不感到惊讶,他们可能想看看您是否能够创建算法并当场提供简单的解决方案,但不使用“现成的”解决方案。

他们可能正在考虑看到您使用动态数组并创建一个(或多个)排序算法。

“我应该使用字符串列表或类似的东西吗?”

回应可能是一样的,同样,我认为他们想看看你是如何“工作”的。

  • @Dorin,不。不幸的是,这绝对是真的。这是一个由美国政府机构生成的文件,提供美国每家医院、诊所、私人医生、实验室、药剂师(和药房)和其他类型医疗机构的信息,解压后实际上超过 4GB。他们不提供我们可以使用的任何其他格式(我认为他们有大型机类型的磁带或其他东西,但它们对我们没有用处。) (2认同)
  • `TFileStream` 一次读取一行文本,快速测试它是否是我们感兴趣的行之一 - 如果不是,请阅读下一行并重复。如果是,请解析我们需要的内容并写入单独的(临时)文件。我们已经尝试将它拆分成线程来处理,但是这个文件真的很糟糕;行从几百个字符到几千个字符不等(基于它们有多少个单独的设施地址),所以拆分它比仅仅运行它更复杂。一旦我们提取了我们的数据(通常为几百 MB),我就有了一个使用这些数据的应用程序。 (2认同)
  • 最终的应用程序会进行一些验证,然后进行处理以导入到我们的数据库中。@Dorin,是的;实际上,这个月的文件已损坏并导致了一些问题。幸运的是,损坏的部分不是我们所关心的。我修改了我们的解析应用程序的一个版本来跟踪最后一个成功的字节位置,然后当它遇到问题区域时跳过,直到找到下一组标记数据并继续处理。即使文件进行了特殊处理,我们也能够提取我们需要的内容。 (2认同)