索引csv文件中的列

时间:2016-03-18 16:24:48

标签: algorithm performance csv search indexing

我有一个大的csv文件,每行有不同的列,例如ID,用户名,电子邮件,工作位置等。

我想按完全匹配(用户名==大卫)或通配符(jobPosition ==%admin)搜索一行。

我想在此文件中对列进行索引以加快搜索速度,但我不知道应该选择哪种算法(特别是对于通配符)。

2 个答案:

答案 0 :(得分:1)

您可以索引文件。但是您需要将其作为二进制文件而不是文本文件来读取。使用128或256块大小。要构建索引,请扫描文件以查找每条记录的开头,然后创建如下索引文件:

  key, 0, 0
   ........
   ........
  key, block, offset

是您要编入索引的键。可以是复合键。 是记录开始时的块编号(请注意您的记录可以跨越多个块),偏移是一个介于两者之间的数字 0到127,它是该块的偏移量,假设块大小为128字节。要检索记录,请在索引文件上查找键(当然使用二进制搜索),然后使用块偏移量直接访问记录。

如果您需要搜索不同的条件,也可以同时创建多个索引文件。

拥有独特的行尾字符会有所帮助,但CR-LF会有所帮助。如果您使用CR-LF,请注意CR可以位于块的确切末尾,而LF将位于下一个的开头。一旦你创建了这个索引文件(或多个文件),你就可以通过密钥对它进行排序,你就可以了。

或者,如果您的软件允许快速移动内存块(如C ++ memmove ),则可以将插入排序与二进制搜索结合使用。这样,在完成索引的构建之后,它们已经被排序了。如果您要管理大量记录,请考虑为索引使用B-Tree结构。

此架构允许您的csv 数据库接受记录添加,删除和更新。在文件末尾添加。要删除记录,只需使用hex(0)这样的唯一字符更改记录的第一个字符,当然也要从索引文件中删除该条目。可以通过删除然后在文件末尾添加更新的记录来实现更新。

这将在数据库上创建一些垃圾收集需求,但大多数DBMS(如果不是全部)都这样做。定期重建索引并删除已删除的记录。

它不是那么复杂,是吗?同意,你可能一开始尝试不会成功。但是谁呢?编程不适合胆小的人。

希望得到这个帮助。

答案 1 :(得分:0)

简短版。将CSV加载到SQLite中,然后查询。您可以在https://www.sqlite.org/了解SQLite,但我建议您使用您的语言查找已有的库。

长版。

在完成如何编写代码之前,您可以将数据加载到SQLite中,对其进行索引,查询和完成。如果您当前不知道如何编写SQL,这甚至是正确的。 (相信我,我知道你需要的算法,学习它们比学习SQL更难。)

在您完成实际编写代码之前,您的替代自我将完成其他几个项目。

编写代码后,就可以进行调试了。我保证你没有成功调试它。与此同时,在替代宇宙中,您还在继续建设更多项目。

一旦您调试了代码并将其投入生产(仍然存在未知错误),您就可以跳过初始加载步骤。与此同时,您的备用宇宙自我甚至不必考虑SQLite是在非常高效的C中实现的事实,其优化器可能与真正的"数据库,但比你自己可以推出的任何东西都好。

鉴于此,你真的应该考虑使用SQLite。

PS:https://www.sqlite.org/fts3.html解释了如何在SQLite中进行通配符匹配。