我正在读取中等大小的 CSV 文件(最多 100K 行和 50 列),当前存储为
headers: List<String>
data: List<List<String>>
我想按给定列中的单元格值进行搜索,返回 {irow, jcol}
。我看过 Guava HashBasedTable
但这没有数字行索引的概念。在编写我自己的(基于 hastable 索引)之前,我很高兴了解使用 CSV 结构的轻量级开源 Java 表工具。
注意:为了回应@Basil,我可以使用只读解决方案,但如果存在,可能会使用添加/删除。
最佳答案
H2 数据库引擎
为什么不使用关系数据库而不是将表格数据转换为非表格 Java 结构?
H2 Database Engine是用纯Java编写的。它可以嵌入到您的 Java 应用程序中。
H2可以直接读取CSV文件。请参阅this tutorial关于使用 CSVREAD
和 CSVWRITE
。或者使用 Apache Commons CSV 库读取 CSV 文件。
如果您希望行具有连续编号,请添加一个额外的列来表示递增的整数,显然您所说的“行索引”是什么意思。
如果您想最大限度地提高性能,您可以指定将数据库保留在内存中而不是持久保存到存储中。
并发
您的评论提到这是一种添加/删除数据的读写情况。这会引发多个线程更新内存中的数据结构以及将文件写入同步到存储的可能的并发问题。
这使得数据库解决方案更加合适,如 concurrency这是一个非常棘手的复杂问题,数据库已经很好地处理了。
请务必了解数据库的并发策略。并发处理没有神奇的完美解决方案,总是需要权衡。 H2数据库默认使用MVCC如its strategy 。
关于java - 索引和搜索 CSV 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38479988/