csv - 用于搜索(大)未排序数组的索引(类型)
问题描述
我有将(有时)大型 CSV 文件加载到数组中的程序。数据无法排序,不知道数据是文本还是数字。这取决于客户。
示例可能是
1;JOHN;DOE
2;JANE;DOE;
3;BOBBY;NOTABLES
但也可以是字符串
MB9384HJ;TEST1
B9284918;TEST2
行数可能高达几百万。
我想在一列中搜索一个特定的值(这是提前知道的,这是我的“关键索引列”)。假设这是唯一的。关键是找到该列在哪一行。
目前代码正在从 1..n 遍历并进行比较。这显然在接近尾声时变慢了。
我正在考虑这些选项:
- 具有键索引值和记录号的内存 SQLite 数据库
- 带键的 TStringDictionary,记录为对
- 哈希字符串列表
我的想法是:我不是遍历数组,而是查询索引的键(客户端提供要搜索的项目,它必须是随机访问的)。然后我立即得到数组的行号,我可以获取数据。
其中哪一个(或其他,如果有的话)将是一个更好的路径?
解决方案
如果您只想搜索密钥,SQLite 可能太多了。如果您用 CSV 填充 SQLite 表并且不仅要对键而且还要对其他列进行复杂的查询,那将会很有趣。
散列字符串列表可能更快,但存在散列冲突问题。
字典可能是您特定情况下的最佳解决方案。因为 Delphi RTL 提供了所需的泛型类,所以这很容易。
推荐阅读
- c# - 无法使用实体框架核心映射实体
- amazon-s3 - 我想知道,如何通过指定一些分支从多分支编写 Jenkinsfile
- c# - 为什么等待之前的异常不会在没有等待的情况下抛出?
- python - 在有和没有特定条件的情况下循环遍历 Pandas DataFrame 中的 2 列
- javascript - 如何从 Redux/react 中的数组状态中删除对象
- javascript - 如何在 chrome 上查看我在亚马逊 as3 上上传的 zip 文件?
- express - 在没有提示的情况下登录用户
- python - 如何通过 Python 运行 C# 控制台应用程序?
- android - TransitionSet - Outgoing Activity 在不指定的情况下淡出
- c++ - 如何从 C/C++ 中的 MAC 地址获取供应商 OUI 和设备名称