我有一个大的csv文件,每行有不同的列,例如ID,用户名,电子邮件,工作位置等。
我想按完全匹配(用户名==大卫)或通配符(jobPosition ==%admin)搜索一行。
我想在此文件中对列进行索引以加快搜索速度,但我不知道应该选择哪种算法(特别是对于通配符)。
答案 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中进行通配符匹配。